Re: Linking Errors- Help Reqd
No, you don't include the header file of subsystem 1. What you do is
use the #import directive to import the DLL of subsystem 1. This will
create a tlh header file for you automatically. It also creates smart
pointers, which are very convenient. Assuming you use the no_namespace
attribute, your code will look something like:
IabcPtr p;
hr = p.CreateInstance (__uuidof (CIabc));
Your NotifyPsc(); function should be made part of an interface to be
accessible to subsystem 2 (the client).
Brian
"Pradeep" <bubunia2000ster@gmail.com> wrote in message
news:5d2b8e7f-ed58-46c1-8758-a1564b119548@v39g2000pro.googlegroups.com...
Hi all,
I am new to ATL/COM technology. I have 2 questions as below.
I have 2 subsystems who have different DLLS and lib. I want to use
services of one subsystems in the other.
a.h
---------
class ATL_NO_VTABLE Cabc :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<Cpsc, &CLSID_abc>,
public ISupportErrorInfo,
public IDispatchImpl<Iabc, &IID_Iabc, &LIBID_abcLib, -1, -1>/*,
public Iabc
{
public:
CIabc();
~CIabc();
DECLARE_REGISTRY_RESOURCEID(IDR_Iabc)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CIabc)
COM_INTERFACE_ENTRY(IIabc)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CIabc)
CONNECTION_POINT_ENTRY(IID_IPiabc)
END_CONNECTION_POINT_MAP()
DECLARE_NOT_AGGREGATABLE(CIabc)
// FinalConstruct, FinalRelease
// Note use of these requires that this object be created
// using CreateInstance (not operator new)
HRESULT FinalConstruct();
void FinalRelease();
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
public:
STDMETHOD(xyz)(BSTR name);
void NotifyPsc(int32_t id, Enum Status);
}
a.cpp
--------
Final Construct(),xyz(),NotifyPsc(int32_t,Enum Status) is
implemented.
In cpp file of the other subsystem2 I want to access the method xyz
and NotifyPsc. How do I do that?
I have included the header files of subsystem1 and included the
library in the linker settings. But In my C++ file when of
subsystem-2
I did the following.
b.cpp
--------
xyz(BSTR name) {
HRESULT hr;
// Create a Cabc Object
CComObject<CIabc>* pObject = 0;
hr = CComObject<CIabc>::CreateInstance(&pObject);
SIL_ASSERT(SUCCEEDED(hr));
hr= pObject->QueryInterface(IID_Iabc,&ptr);
ptr->xyz(name); (xyz is the function of subsystem1)
}
I got lot of linker errors as follows:
1>abc.obj : error LNK2019: unresolved external symbol "public: long
__thiscall abc::FinalConstruct(void)" (?FinalConstruct@abc@@QAEJXZ)
referenced in function __catch$?CreateInstance@?
$CComObject@Vabc@@@ATL@@SGJPAPAV12@@Z$0
1>abc.obj : error LNK2019: unresolved external symbol "public:
__thiscall abc::abc(void)" (??0abc@@QAE@XZ) referenced in function
"public: __thiscall ATL::CComObject<class abc>::CComObject<class
abc>
(void *)" (??0?$CComObject@Vabc@@@ATL@@QAE@PAX@Z)
1>abc.obj : error LNK2001: unresolved external symbol "public:
virtual
void __thiscall abc::NotifyPsc(long,enum Status)" (?
Notifyabc@abc@@UAEXJW4tagCalStatus@@@Z)
1>abc.obj : error LNK2019: unresolved external symbol "public:
virtual
__thiscall abc::~abc(void)" (??1abc@@UAE@XZ) referenced in function
"public: virtual __thiscall ATL::CComObject<class
abc>::~CComObject<class abc>(void)" (??1?
$CComObject@Vabc@@@ATL@@UAE@XZ)
1>abc.obj : error LNK2019: unresolved external symbol "public: void
__thiscall abc::FinalRelease(void)" (?FinalRelease@abc@@QAEXXZ)
referenced in function "public: virtual __thiscall
ATL::CComObject<class abc>::~CComObject<class abc>(void)" (??1?
$CComObject@Vabc@@@ATL@@UAE@XZ)
1.Can any body tell me how can I use the methods of class Cabc of
subsystem1(notifyPsc(),xyz()) in subsystem-2?
2. How to fix these linking errors?
I will appreciate any help on the same?
Regards
Pradeep