如題,我寫了一個控制臺程式,試圖通過呼叫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?請各位大神解答。謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/279718.html
