Last active
August 29, 2015 14:05
-
-
Save zxlooong/c340d1b2e8788d8b27eb to your computer and use it in GitHub Desktop.
com调用相关
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void IDispatchInvoke() | |
{ | |
// TODO: Add your implementation code here | |
::CoInitialize(NULL); // COM 初始化 | |
CLSID clsid; // 通过 ProgID 得到 CLSID | |
HRESULT hr = ::CLSIDFromProgID(L"Ctrl.1", &clsid); | |
//ASSERT(SUCCEEDED(hr)); // 如果失败,说明没有注册组件 | |
IDispatch * pDisp = NULL; // 由 CLSID 启动组件,并得到 IDispatch 指针 | |
hr = ::CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp); | |
//ASSERT(SUCCEEDED(hr)); // 如果失败,说明没有初始化 COM | |
LPOLESTR pwFunName = L"TestHello"; // 准备取得 Add 函数的序号 DispID | |
DISPID dispID; // 取得的序号,准备保存到这里 | |
hr = pDisp->GetIDsOfNames( // 根据函数名,取得序号的函数 | |
IID_NULL, | |
&pwFunName, // 函数名称的数组 | |
1, // 函数名称数组中的元素个数 | |
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境 | |
&dispID); // 返回值 | |
//ASSERT(SUCCEEDED(hr)); // 如果失败,说明组件根本就没有 ADD 函数 | |
VARIANTARG v[2]; // 调用 Add(1,2) 函数所需要的参数 | |
v[0].vt = VT_I4; v[0].lVal = 2; // 第二个参数,整数2 | |
v[1].vt = VT_I4; v[1].lVal = 1; // 第一个参数,整数1 | |
//DISPPARAMS dispParams = { v, NULL, 2, 0 }; // 把参数包装在这个结构中 | |
DISPPARAMS dispParams = { v, NULL, 0, 0 }; // 把参数包装在这个结构中 | |
VARIANT vResult; // 函数返回的计算结果 | |
hr = pDisp->Invoke( // 调用函数 | |
dispID, // 函数由 dispID 指定 | |
IID_NULL, | |
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境 | |
DISPATCH_METHOD, // 调用的是方法,不是属性 | |
&dispParams, // 参数 | |
&vResult, // 返回值 | |
NULL, // 不考虑异常处理 | |
NULL); // 不考虑错误处理 | |
//ASSERT(SUCCEEDED(hr)); // 如果失败,说明参数传递错误 | |
//CString str; // 显示一下结果 | |
//str.Format(_T("1 + 2 = %d"), vResult.lVal); | |
//AfxMessageBox(str); | |
pDisp->Release(); // 释放接口指针 | |
::CoUninitialize(); // 释放 COM | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//idl: | |
//[propget, id(1)] HRESULT impl([out, retval] IDispatch** pVal); | |
public: | |
STDMETHOD(get_impl)(IDispatch** pVal); | |
private: | |
CComPtr<IDispatch> mpDispImpl; | |
CWyCertPlugin() | |
{ | |
INDENT_FUNCTION_INOUT_LOG; | |
::CoInitialize(NULL); | |
mpDispImpl = NULL; | |
CLSID clsid; | |
HRESULT hr = ::CLSIDFromProgID(_T("PluginAPI.1"), &clsid); | |
if(hr != ERROR_SUCCESS){ | |
DBGLOG((_T("CLSIDFromProgID 'PluginAPI.1' ERROR, 0x%08x"), hr)); | |
return; | |
} | |
hr = ::CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&mpDispImpl); | |
if(hr != ERROR_SUCCESS){ | |
DBGLOG((_T("CoCreateInstance 'PluginAPI.1' ERROR, 0x%08x"), hr)); | |
return; | |
} | |
mpDispImpl.p->AddRef(); | |
} | |
~CPlugin() | |
{ | |
INDENT_FUNCTION_INOUT_LOG; | |
if(NULL!=mpDispImpl){ | |
mpDispImpl.p->Release(); | |
} | |
::CoUninitialize(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment