日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何在MFC客户端调用COM DLL

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在MFC客户端调用COM DLL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
也許有人會認(rèn)為這是一個非常小兒科的問題。不過,我還是頗花費(fèi)了一點(diǎn)時間和精力才搞清楚的。OK, 下面簡單談一下如何去做。
可以有很多方法生成一個COM DLL。比如,VB, VC++, DELPHI等等。由于筆者只略通VB和VC,就只用他們作例子了。
(一)VC生成的DLL
如果是VC生成的DLL,通常你可以通過該DLL的TLB(Type Library)在MFC客戶端調(diào)用該DLL.
假設(shè)DLL的tlb文件是testATL.tlb,該DLL的IDL文件內(nèi)容如下:
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中的類和調(diào)用其中的方法了。
??? 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,通過它你就可以調(diào)用DLL中的function了。
奧,還有就是別忘了在這段代碼前后調(diào)用CoInitialize()和CoUninitialize()。他們的作用我就不說了。什么不清楚?!·#¥%…………—?
(二)VB生成的DLL
其實VB生成的COM DLL和VC生成COM DLL基本類似(廢話,不都是實現(xiàn)了COM接口嗎)。如果說有區(qū)別的話,VB生成的COM DLL自包含了type library.這樣MFC的代碼就稍有不同了。(我只是從codeproject摘錄了VB的部分,你可從http: //www.codeproject.com/dll/vbactivexwithvc.asp閱讀Amit Dey的文章)
1)
# import "prjdll.dll"
using namespace prjdll;
當(dāng)然也必須放在那個奇怪的地方。
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調(diào)用VC生成的COM DLL.不過,好像有些多此一舉。



轉(zhuǎn)載于:https://www.cnblogs.com/userinterface/archive/2005/03/22/123575.html

總結(jié)

以上是生活随笔為你收集整理的如何在MFC客户端调用COM DLL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。