Atl Com组件DLL非注册调用

来源:互联网 发布:161631人工智能怎么 编辑:程序博客网 时间:2024/05/16 11:09

1:包含头文件:
、#include “../ATLcomMfc/ATLcomMfc_i.h”
、#include “../ATLcomMfc/ATLcomMfc_i.c”
可不引入: “../ATLcomMfc/ATLcomMfc_i.c” ;那样在使用CLSID_Student, IID_IStudent需要替换为:__uuidof(Student),__uuidof(IStudent)。引入该文件的目的就是获取对应的clsid,iid。

因为头文件中有函数定义,和clsid,iid的声明;未修改接口定义的情况下,这两个文件就不会有变化。
2:定义函数指针,加载dll文件

 //没有将com接口在系统注册的情况        typedef HRESULT(__stdcall * pmath)(REFCLSID, REFIID, void**);        pmath fnHello = NULL;        HINSTANCE hdllInst = LoadLibrary(L"..\\Debug\\ATLcomMfc.dll");        fnHello = (pmath)GetProcAddress(hdllInst, "DllGetClassObject");

3:判断是否加载成功

if (fnHello != 0)             {                 IClassFactory* pcf = NULL;                 ATLTRACE(_T("\nRun to here ...\n"));                 HRESULT hr = fnHello(CLSID_Student, IID_IClassFactory, (void**)&pcf);                 ATLTRACE(_T("\nRun to here ...%d\n"), hr);                 if (SUCCEEDED(hr) && (pcf != NULL))                 {                     ATLTRACE(_T("\n>>>>>>>>>>>>>> ...%d\n"), hr);                     CComPtr<IStudent> pGetRes2 = NULL;                     hr = pcf->CreateInstance(NULL,  IID_IStudent, (void**)&pGetRes2);                     if (SUCCEEDED(hr) && (pGetRes2 != NULL))     //这里hr成功了,pGetRes2应该不会null                     {                         pGetRes2->Add(3, 4, &sum);                         pGetRes2->sub(10, 4, &su);                     }                     pcf->Release();                 }             }

3:释放dll句柄

             FreeLibrary(hdllInst);
0 0
原创粉丝点击