如何在MFC客户端调用COM DLL
生活随笔
收集整理的這篇文章主要介紹了
如何在MFC客户端调用COM DLL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
也許有人會認為這是一個非常小兒科的問題。不過,我還是頗花費了一點時間和精力才搞清楚的。OK, 下面簡單談一下如何去做。
可以有很多方法生成一個COM DLL。比如,VB, VC++, DELPHI等等。由于筆者只略通VB和VC,就只用他們作例子了。
(一)VC生成的DLL
如果是VC生成的DLL,通常你可以通過該DLL的TLB(Type Library)在MFC客戶端調用該DLL.
假設DLL的tlb文件是testATL.tlb,該DLL的IDL文件內容如下:
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;
??? };
};
你只要在MFC客戶端加入如下代碼就可了。
1)
#import "..\testATL\testATL.tlb"???? //..\testATL是客戶端的相對路徑
using namespace TESTATLLib;
且慢,這段代碼加到哪里呢?他們只能位于下面#endif之上和注釋之下。否則,嘿嘿。。。
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_XXXDLG_H__CDD4B4C8_59E6_4C9C_BDF8_2820FF496074__INCLUDED_)
2)
接下來,就可以聲明DLL中的類和調用其中的方法了。
??? ItestATLxPtr test(__uuidof(testATLx));
??? long y=test->addLong(8);
ItestATLxPtr是什么鬼東西?簡單,就是你的DLL中coclass Interface的指針。如果你的Interface是ItestATLx,他就是ItestATLxPtr.如果他是InormalCom,那他就是 InormalComPtr. testATLx嗎,不用我說你也知道,coclass! 好了,通過ItestATLxPtr test(__uuidof(testATLx))你就獲得一個test,通過它你就可以調用DLL中的function了。
奧,還有就是別忘了在這段代碼前后調用CoInitialize()和CoUninitialize()。他們的作用我就不說了。什么不清楚?!·#¥%…………—?
(二)VB生成的DLL
其實VB生成的COM DLL和VC生成COM DLL基本類似(廢話,不都是實現了COM接口嗎)。如果說有區別的話,VB生成的COM DLL自包含了type library.這樣MFC的代碼就稍有不同了。(我只是從codeproject摘錄了VB的部分,你可從http: //www.codeproject.com/dll/vbactivexwithvc.asp閱讀Amit Dey的文章)
1)
# import "prjdll.dll"
using namespace prjdll;
當然也必須放在那個奇怪的地方。
2)
HRESULT hresult;
CLSID 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
(三)其他
其實,你也可以通過CLSIDFromProgID調用VC生成的COM DLL.不過,好像有些多此一舉。
可以有很多方法生成一個COM DLL。比如,VB, VC++, DELPHI等等。由于筆者只略通VB和VC,就只用他們作例子了。
(一)VC生成的DLL
如果是VC生成的DLL,通常你可以通過該DLL的TLB(Type Library)在MFC客戶端調用該DLL.
假設DLL的tlb文件是testATL.tlb,該DLL的IDL文件內容如下:
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;
??? };
};
你只要在MFC客戶端加入如下代碼就可了。
1)
#import "..\testATL\testATL.tlb"???? //..\testATL是客戶端的相對路徑
using namespace TESTATLLib;
且慢,這段代碼加到哪里呢?他們只能位于下面#endif之上和注釋之下。否則,嘿嘿。。。
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_XXXDLG_H__CDD4B4C8_59E6_4C9C_BDF8_2820FF496074__INCLUDED_)
2)
接下來,就可以聲明DLL中的類和調用其中的方法了。
??? ItestATLxPtr test(__uuidof(testATLx));
??? long y=test->addLong(8);
ItestATLxPtr是什么鬼東西?簡單,就是你的DLL中coclass Interface的指針。如果你的Interface是ItestATLx,他就是ItestATLxPtr.如果他是InormalCom,那他就是 InormalComPtr. testATLx嗎,不用我說你也知道,coclass! 好了,通過ItestATLxPtr test(__uuidof(testATLx))你就獲得一個test,通過它你就可以調用DLL中的function了。
奧,還有就是別忘了在這段代碼前后調用CoInitialize()和CoUninitialize()。他們的作用我就不說了。什么不清楚?!·#¥%…………—?
(二)VB生成的DLL
其實VB生成的COM DLL和VC生成COM DLL基本類似(廢話,不都是實現了COM接口嗎)。如果說有區別的話,VB生成的COM DLL自包含了type library.這樣MFC的代碼就稍有不同了。(我只是從codeproject摘錄了VB的部分,你可從http: //www.codeproject.com/dll/vbactivexwithvc.asp閱讀Amit Dey的文章)
1)
# import "prjdll.dll"
using namespace prjdll;
當然也必須放在那個奇怪的地方。
2)
HRESULT hresult;
CLSID 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
(三)其他
其實,你也可以通過CLSIDFromProgID調用VC生成的COM DLL.不過,好像有些多此一舉。
轉載于:https://www.cnblogs.com/userinterface/archive/2005/03/22/123575.html
總結
以上是生活随笔為你收集整理的如何在MFC客户端调用COM DLL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: event loop、进程和线程、任务队
- 下一篇: C#:多线程使用TextBox控件