IDispatch::GetIDsOfNames每次只能获得COM组件的1个方法名的DISPID?

狐帝 2021-04-24 08:37:47
如题,我写了一个控制台程序,试图通过调用IDispatch::GetIDsOfNames一次性获得ShockwaveFlash组件的多个方法的DISPID,但是调用失败了,返回值是0x80020006,意思是“未知名称”。我的代码如下:

#include <shlobj.h>
#include <shobjidl.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <combaseapi.h>
#include <windows.h>

using namespace std;

void studyGetMultiIdsForNames()
{
CLSID const clsid = { 0xD27CDB6E, 0xAE6D, 0x11CF, {0x96, 0xB8, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0} };

IUnknown *object = nullptr;
HRESULT hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, IID_IUnknown, reinterpret_cast<void **>(&object));
cout << "CoCreateInstance(): " << dec << hr << endl;
cout << "IUnknown *object = " << object << endl;

IDispatch *disp = nullptr;
hr = object->QueryInterface(IID_IDispatch, (void **)(&disp));
cout << "object->QueryInterface(): " << dec << hr << endl;
cout << "IDispatch *disp = " <<disp << endl;

const size_t nameCount = 4;// sizeof methodNames / sizeof methodNames[0];
BSTR methodNames[nameCount] = { (BSTR)(L"LoadMovie"), (BSTR)(L"FlashVersion"), (BSTR)(L"Play"), (BSTR)(L"Stop") };
DISPID dispIds[nameCount] = { 0 };
hr = disp->GetIDsOfNames(IID_NULL, methodNames, nameCount, LOCALE_SYSTEM_DEFAULT, dispIds);
cout << "disp->GetIDsOfNames(, , 4, ): " << hex << showbase << hr << endl;
for (size_t index = 0; index < nameCount; index++)
{
wcout << dispIds[index] << " : " << methodNames[index] << endl;
}

disp->Release();
object->Release();
}

int main()
{
CoInitializeEx(nullptr, COINIT_MULTITHREADED);

studyGetMultiIdsForNames();

CoUninitialize();
}

运行结果如下:

CoCreateInstance(): 0
IUnknown *object = 0x8d9180
object->QueryInterface(): 0
IDispatch *disp = 0x8ca248
disp->GetIDsOfNames(, , 4, ): 0x80020006
142 : LoadMovie
-1 : FlashVersion
-1 : Play
-1 : Stop

这段代码中,第28行disp->GetIDsOfNames调用后返回0x80020006,只有methodNames数组中的第一个方法名得到了DISPID,其他的三个的DISPIP都只是-1。难道IDispatch::GetIDsOfNames每次只能获得COM组件的1个方法名的DISPID?请各位大神解答。谢谢!
...全文
2482 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
狐帝 2021-04-27
  • 打赏
  • 举报
回复
明白了,谢谢!

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧