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);