一个用MFC写的OCX控件,派发接口在odl控件中的定义为:
helpstring("BasicInfo Control"), hidden ]
dispinterface _DBasicInfo
{
properties:
methods:
[id(1)] void ShowLog();
[id(2)] void SaveFile();
[id(3)] void DevMgmtMsc();
[id(4)] void HtmlHelp();
[id(DISPID_ABOUTBOX)] void AboutBox();
};我是在WTL中用CAxWindow来创建并用IDispatch接口来调用它的函数的:
CAxWindow wndBasic;
......
CComPtr<IDispatch> pDispatch;
wndBasic.QueryControl(IID_IDispatch, (void **)&pDispatch);
DISPID did;
LPOLESTR lpOleStr = L"ShowLog";
HRESULT hr = pDispatch->GetIDsOfNames(IID_NULL, &lpOleStr, 1, LOCALE_SYSTEM_DEFAULT, &did); //成功,did=1
hr = pDispatch->Invoke(did, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, NULL, NULL, 0, NULL); //失败,返回hr=E_INVALIDARGInvoke函数老是失败,在MFC中用InvokeHelper就能成功
请问我写的Invoke函数哪里不对吗?
helpstring("BasicInfo Control"), hidden ]
dispinterface _DBasicInfo
{
properties:
methods:
[id(1)] void ShowLog();
[id(2)] void SaveFile();
[id(3)] void DevMgmtMsc();
[id(4)] void HtmlHelp();
[id(DISPID_ABOUTBOX)] void AboutBox();
};我是在WTL中用CAxWindow来创建并用IDispatch接口来调用它的函数的:
CAxWindow wndBasic;
......
CComPtr<IDispatch> pDispatch;
wndBasic.QueryControl(IID_IDispatch, (void **)&pDispatch);
DISPID did;
LPOLESTR lpOleStr = L"ShowLog";
HRESULT hr = pDispatch->GetIDsOfNames(IID_NULL, &lpOleStr, 1, LOCALE_SYSTEM_DEFAULT, &did); //成功,did=1
hr = pDispatch->Invoke(did, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, NULL, NULL, 0, NULL); //失败,返回hr=E_INVALIDARGInvoke函数老是失败,在MFC中用InvokeHelper就能成功
请问我写的Invoke函数哪里不对吗?
解决方案 »
- 一个关于复选框的问题
- [在线求助]为何SetLayeredWindowAttributes设置背景透明度在Windows7下失效了
- 对话框贴图问题
- 提问:treeview 遍历指定路径的目录树
- 如何提取24位图像的RGB分量图像,如何显示?(调色板需要设置吗?)
- 如何调整ccombobox的下拉筐高度。 我的ccombobox是动态生成的如何调整。
- 为什么属性页上的控件总是显示在背景上,而不显示在属性页上(在线等待)
- ***如何在PICTURE控件上显示资源位图?***
- [求助]有的电脑里在OnQueryEndSession()里return false不能停止关机
- 网吧用的安全程序,例如"美萍安全卫士" 是怎么做的?
- 把CDialog的父窗口设置为另一个进程的窗口,会发生什么事?
- 请教vc2005里面的DataGrid成员函数put_Appearance
=================
注意第5个参数不能为NULL。应该这个调用:
DISPPARAMS dp = {NULL, NULL, 0, 0};
hr = pDispatch->Invoke(did, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, NULL, 0, NULL);