|
Thanks CPallini,
CPallini wrote: For instance, a component that does not support automation.
In the context of supporting automation, when in implement a component in C++, are there any ways to implement it not as a dual interface?
I have this confusion is because, if I remember clearly, if a component supports automation, it must inherit from IDispatch interface, then it must be a dual interface.
Any ideas?
regards,
George
|
|
|
|
|
George_George wrote: In the context of supporting automation, when in implement a component in C++, are there any ways to implement it not as a dual interface?
Yes.
George_George wrote: I have this confusion is because, if I remember clearly, if a component supports automation, it must inherit from IDispatch interface, then it must be a dual interface.
Actually you can derive from IDispatch and at same time don't declare your interface as dual.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini!
Two confusions,
1. What is the purpose of doing so "in practice"? Force user to use IDispatch other than efficient vtable?
2. Could we use vtable even if dual property is not added to interface? For example, using QueryInterface to get some interface other than IUnknown and IDispatch, then invoke its member function just the same as invoking through vtable?
regards,
George
|
|
|
|
|
George_George wrote: 1. What is the purpose of doing so "in practice"? Force user to use IDispatch other than efficient vtable?
In practice you use IDispatch on VTABLE capable client only if you need late binding.
George_George wrote: 2. Could we use vtable even if dual property is not added to interface? For example, using QueryInterface to get some interface other than IUnknown and IDispatch, then invoke its member function just the same as invoking through vtable?
You can always use VTABLE on all of the COM Interfaces. what dual really means is that the same functionalities that you can access via IDispatch mechanism are also available as standard COM methods (i.e. are part of the interface itself).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
1.
CPallini wrote: In practice you use IDispatch on VTABLE capable client only if you need late binding.
You mean QueryInterface for IDispatch interface? What mean later binding?
2.
CPallini wrote: You can always use VTABLE on all of the COM Interfaces. what dual really means is that the same functionalities that you can access via IDispatch mechanism are also available as standard COM methods (i.e. are part of the interface itself).
So you mean even if we do not explicitly add dual to the property, we can still use dual (by vtable and by IDispatch.invoke()) functions if underlying component support it?
If yes, what is the function of dual keyword? It does not enforce anything strictly, right?
(non-dual does not mean there is single -- IDispatch.invoke -- method to access component)
regards,
George
|
|
|
|
|
George_George wrote: You mean QueryInterface for IDispatch interface? What mean later binding?
For instance (maybe syntax is not correct, I havent VB6 at hand)
Dim objSer as Object
set objSer = CreateObject("MSCOMMLib.MSComm")
is late binding, i.e. MSComm object is ignored at compile time and you can only access objSer functionality through IDispatch . Late binding is often useful.
George_George wrote: So you mean even if we do not explicitly add dual to the property, we can still use dual (by vtable and by IDispatch.invoke()) functions if underlying component support it?
If yes, what is the function of dual keyword? It does not enforce anything strictly, right?
Well dual keyword is MIDL . MIDL files generate typelibs, headers and source files. But the true impact of the dual keyword on such files I don't know.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
CPallini wrote: For instance (maybe syntax is not correct, I havent VB6 at hand)
Dim objSer as Objectset objSer = CreateObject("MSCOMMLib.MSComm")
is late binding, i.e. MSComm object is ignored at compile time and you can only access objSer functionality through IDispatch. Late binding is often useful.
1.
If I remember correctly (I am not VB expert), in VB to access some object in COM, we have to program in the way above, does it mean VB always use later binding?
2.
Do you mean there are any other ways to access VB in COM, that is not later binding?
3.
Later binding means runtime binding, right? In runtime, using invoke method on the IDispatch interface of the component?
regards,
George
|
|
|
|
|
George_George wrote: If I remember correctly (I am not VB expert), in VB to access some object in COM, we have to program in the way above, does it mean VB always use later binding?
2.
Do you mean there are any other ways to access VB in COM, that is not later binding?
No. You can also, for instance, import into your VB6 project the MSComm object as ActiveX control at design time, say MSComm1 and then use it inside code, this way you will use early binding and VTABLE access to the component.
George_George wrote: 3.
Later binding means runtime binding, right? In runtime, using invoke method on the IDispatch interface of the component?
Yes.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
1.
For the later binding case (suppose client will use invoke, other than vtabke), I am wondering during compile/build phase, how will the client (C++, VB, VBScript, etc.) utilize the TLB file? Does the contained interface function information be read and checked?
(I think the answer is no)
2.
So, all the interface/function/parameter checking work in done during runtime?
regards,
George
|
|
|
|
|
George_George wrote: 1.
For the later binding case (suppose client will use invoke, other than vtabke), I am wondering during compile/build phase, how will the client (C++, VB, VBScript, etc.) utilize the TLB file? Does the contained interface function information be read and checked?
(I think the answer is no)
Type libraries are not used in late binding case.
George_George wrote: So, all the interface/function/parameter checking work in done during runtime?
Yes this the automation mechanism.
Automation client need only IDispatch interface, all of the server functionality is accessed via IDispatch methods (i.e. GetIDsOfNames , Invoke , ..)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
Quite interesting, you mean if we write statement like this in VB (later binding),
Dim objSer as Objectset
objSer = CreateObject("MSCOMMLib.MSComm")
during compile/build phase in VB, nothing is checked? Even if the component progID MSCOMMLib.MSComm is not checked?
(if yes, type library is not used at compile/build time)
regards,
George
|
|
|
|
|
Exactly, the following code succesfully compiles on my system
Private Sub Command1_Click()
Dim obj As Object
Set obj = CreateObject("George.George")
End Sub
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
My question is answered! You are so knowledgeable! Cool!!
regards,
George
|
|
|
|
|
George_George wrote: once we inherit from IDispatch interface, then it is always a dual interface, right?
why u said so.
George_George wrote: What type of implementation in C++ for a component is not a dual interface? I can not imagine a sample
I think ur confusion is once derived from IDispatch in C++, u have access through vtbl (atleast of IDispatch) and also through Invoke(), dual implicit and why u need dual keyword. Is it?
|
|
|
|
|
Yes Rajkumar,
Rajkumar R wrote: I think ur confusion is once derived from IDispatch in C++, u have access through vtbl (atleast of IDispatch) and also through Invoke(), dual implicit and why u need dual keyword. Is it?
Sometimes I notice that the component actually implements the dual interface, but in the IDL file, "dual" property is not added to the interface property.
1. Is it good practice?
2. What is the purpose of doing so? Force user to use IDispatch other than efficient vtable?
3. Could we use vtable even if dual property is not added to interface? For example, using QueryInterface to get come component interface (other than IDispatch and IUnknown)? If we could, then it is a dual interface activity -- invoking through vtable.
regards,
George
|
|
|
|
|
yes!! I guessed correctly, u misunderstood the concept of dual interface in OA.
direct vtable-based interfaces as u expect are called "custom interfaces" and invocation through IDispatch are called "automation" or "dispatch interfaces" the "custom interfaces" may need to be accessed after a query interface and may needs custom marshalling. Dual iterfaces can be accessed without a query interface and gets standard marshalling support like dispatch interfaces.
a comparison of these 3 interfaces is here [^]
|
|
|
|
|
Thanks Rajkumar,
Sorry that I may not made myself understood. My question is, if I do not declare the interface as dual in IDL file, but actually in implementation, I implemented the dual approach.
Could the client of the component (e.g. in case of C++ client) utilize vtable other than through IDispatch?
regards,
George
|
|
|
|
|
George_George wrote: but actually in implementation, I implemented the dual approach.
again, don't confuse it with "custom interface"
George_George wrote: Could the client of the component (e.g. in case of C++ client) utilize vtable other than through IDispatch?
yes, u can, use queryinterface and get ur "custom interface".
|
|
|
|
|
Thanks Rajkumar,
Seems the dual property does not enforce compile/link/runtime's strong checking about whether or not the component implements dual interfaces (if the component does not implement dual interface, and there will not be any compile/link/runtime error if component only implemeents IDispatch)? Right?
And similar to the situation when we do not add dual, compile/link/runtime does not enforce strong checking and gives warning or error message when client tries to use dual interface (both vtable and IDispatch), right?
regards,
George
|
|
|
|
|
Hi,
I need to compare two text files in VC++6.0, whose contents have been displayed in two richedit controls.Also i need to highlight the differences that exists in the two files......Can any one help me out?
|
|
|
|
|
|
What have you tried so far? Where are you stuck?
|
|
|
|
|
i have displayed the contents of the files in the richeditcontrols.I dont know how to compare the files and highlight the differences in them.The codes which i got by surfing the net just tell whether the files are equal or not.They just return an int or bool value.Here is the place i got struck.
|
|
|
|
|
I think it's rather a complex task. I don't think you will get the "code" here right away. You may have to look at the XDiff[^] project. Perhaps that would help you.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
My condolences. I had to do the exactly same thing some 5 years ago, and ended up with a post "I hate MFC" in the Lounge
Anyway, to find the differences between files, use Longest Common Subseqence Algorithm[^] - that would be the easy part.
Now, for displaying it in the richedit controls - good luck with that
|
|
|
|
|