|
Prasanth M V wrote: But when i ma using this in amy application , it is showing an error
error LNK2001: unresolved external symbol "public: static int CMyClass::nValue" (?nValue@CMyClass@@2HA)
You need to link the importation library of the DLL (for instance if your DLL is MyClass.DLL , then you have to link your application with MyClass.lib ).
You may add MyClass.lib to the linker command line in the project settings.
Probably you need also to specify the folder wherein the linker may find the importation library (choose Tools->Options menu item then select the Project and Solutions->VC++ Directories , select Library files into the show directories for listbox and finally add the MyClass.lib folder path to the list).
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
|
|
|
|
|
Hi,
I have already given the import lib file to the project.
And i could access all the class members expect the Static member of the class.
Then ???
Thanks,
Prasanth
|
|
|
|
|
Prasanth M V wrote: I have already given the import lib file to the project.
And i could access all the class members expect the Static member of the class.
Then ???
Then I dont know. I mean, the following very simple test:
DLL header file
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
class CPPDLL_API CCppDll {
public:
CCppDll(void);
~CCppDll(void);
static int nValue;
};
DLL source file
CCppDll::CCppDll()
{
return;
}
CCppDll::~CCppDll()
{
return;
}
int CCppDll::nValue = 0;
client application
#include "stdafx.h"
#include "..\\..\\CppDLL\\CppDLL\CppDLL.h"
int _tmain(int argc, _TCHAR* argv[])
{
CCppDll::nValue =5;
} it's working fine on my system.
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
|
|
|
|
|
Hi All,
Its is workign fine
Thanks for your support
----------------------------------------
But one intesting thing i see is that i give the CPPDLL_EXPORTS in the project settings.
If i am giving it in StdAfx.h i will work.
OK NAy i worked.
Thanks
Alot
|
|
|
|
|
Hi All,
Its is workign fine
Thanks for your support
----------------------------------------
But one intesting thing i see is that i give the CPPDLL_EXPORTS in the project settings.
If i am giving it in StdAfx.h i will work.
OK Anyway it worked.
Thanks
Alot
|
|
|
|
|
Did you link with the lib file generated when you built the dll ?
EDIT: oww, I just saw your mistake: you are defining _MYDLL in the header file of CMyClass. So it will ALWAYS be defined (even in the code of the executable), so MY_API will always relate to __declspec(dllexport).
You should define _MYDLL in the preprocessor definitions of your dll only.
|
|
|
|
|
Hello everyone,
Could anyone show me a sample or where to find dual interface implementation for IDispatch please?
I have seached for MSDN and Google for half an hour and seems all I could get are MFC based.
Any non-MFC and non-ATL (pure C++) sample?
thanks in advance,
George
|
|
|
|
|
http://www.codeproject.com/KB/COM/com_in_c2.aspx[^]
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,
I read through related code and find it uses the dual property to qualify the interface, here is the related code,
(IExample2.idl)
[uuid(B6127C55-AC5F-4ba0-AFF6-7220C95EEF4D), dual, oleautomation, hidden, nonextensible]
I feel I miss the concept (at least to some level) of the dual interface. Any benefits we could have if we add dual property?
regards,
George
|
|
|
|
|
A dual interface [^] can invoked both the classical, faster way (i.e. through VTABLE) and the automation, slower one.
For instance VB6 Clients can take advantage of the VTable approach while VBSCript ones have to use automation approach.
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!
Good link!! Now my confusion is, to implement an interface for OLE automation, once we inherit from IDispatch interface, then it is always a dual interface, right?
What type of implementation in C++ for a component is not a dual interface? I can not imagine a sample. Any ideas?
regards,
George
|
|
|
|
|
George_George wrote: Good link!! Now my confusion is, to implement an interface for OLE automation, once we inherit from IDispatch interface, then it is always a dual interface, right?
You may also choose to not declare your interface dual, but, as stated in the MSDN page:
dual interfaces are recommended whenever possible
George_George wrote: What type of implementation in C++ for a component is not a dual interface?
For instance, a component that does not support automation.
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, 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
|
|
|
|
|