Some may think this is a very pediatric problem. However, it took me some time and effort to figure it out. OK. Let's briefly talk about how to do this.
There are many ways to generate a com DLL. For example, VB, VC ++, and Delphi. Since I only omitted VB and Vc, I just used them as an example.
(1) DLL generated by VC
If the DLL is generated by VC, you can call the DLL on the MFC client through The TLB (Type Library) of the DLL.
Assume that the TLB file of the DLL is testatl. TLB. The content of the IDL file of the DLL is as follows:
Import "oaidl. IDL ";
Import "ocidl. IDL ";
[
Object,
UUID (0a2e8c16-7043-4fe9-8af1-545e88edbe14 ),
Dual,
Helpstring ("itestatlx interface "),
Pointer_default (unique)
]
Interface itestatlx: idispatch
{
[ID (1), helpstring ("method addlong")] hresult addlong ([in] Long X, [out, retval] Long * y );
};
[
UUID (AD75C4D3-958D-4A31-9BB7-512A8B4CCB60 ),
Version (1.0 ),
Helpstring ("testatl 1.0 Type Library ")
]
Library testatllib
{
Importlib ("stdole32.tlb ");
Importlib ("stdole2.tlb ");
[
UUID (94be9ef2-d9f9-469b-bff4-5aba71dadc38 ),
Helpstring ("testatlx class ")
]
Coclass testatlx
{
[Default] interface itestatlx;
};
};
You only need to add the followingCodeYou can.
1)
# Import ".. \ testatl. TLB" // .. \ testatl is the relative path of the Client
Using namespace testatllib;
Slow down. Where can this code be added? They can only be located below # endif and under annotations. Otherwise, hey...
// {Afx_insert_location }}
// Microsoft Visual C ++ will insert additional declarations immediately before the previous line.
# Endif //! Defined (afx_xxxdlg_h1_cdd4b4c8_59e6_4c9c_bdf8_2820ff4960741_encoded _)
2)
Next, you can declare the classes in the DLL and call the methods in the DLL.
Itestatlxptr test (_ uuidof (testatlx ));
Long y = test-> addlong (8 );
What is itestatlxptr? Simple: coclass in your DLL
Interface pointer. If your interface is itestatlx, It is itestatlxptr. If it is inormalcom, it is
Inormalcomptr. testatlx? I don't need to say you know, coclass! Okay, via itestatlxptr
Test (_ uuidof (testatlx), you get a test, through which you can call the function in the DLL.
And don't forget to call coinitialize () and couninitialize () before and after this code (). I won't talk about their role. What is unclear ?! · # ¥ % ............ -?
(2) DLL generated by VB
In fact, the com DLL generated by VB is basically similar to the com DLL generated by VC (not all implement the COM interface ). If there is a difference, the com generated by VB
DLL self-contained type
Library. In this way, the MFC code is slightly different. (I just extracted the VB part from codeproject. You canHTTP:
// Www.codeproject.com/dll/vbactivexwithvc.aspReadAmit deyOfArticle)
1)
# Import "prjdll. dll"
Using namespace prjdll;
Of course, it must also be placed in that strange place.
2)
Hresult;
CLSID;
Coinitialize (null); // initialize com Library
Hresult = clsidfromprogid (olestr ("prjdll. clsdll"), & CLSID); // retrieve CLSID of component
_ Clsdll * t;
Hresult = cocreateinstance (CLSID, null, clsctx_inproc_server ,__ uuidof (_ clsdll), (lpvoid *) & T );
If (failed (hresult ))
{
Afxmessagebox ("creation failed ");
Return;
}
T-> fncalldll (); // call Method
T-> release (); // call Method
Couninitialize (); // unintialize the com Library
(3) Others
You can also call the com DLL generated by VC through clsidfromprogid.