Skip to content

Instantly share code, notes, and snippets.

@zxlooong
Last active August 29, 2015 14:05
Show Gist options
  • Save zxlooong/c340d1b2e8788d8b27eb to your computer and use it in GitHub Desktop.
Save zxlooong/c340d1b2e8788d8b27eb to your computer and use it in GitHub Desktop.
com调用相关
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
}
//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