如何调用GetIDsOfNames以解决几种方法的方法ID?它只适用于解析一个或第一个MethodID。
我的代码现在:
pDisp : IDispatch;
intResult : HResult;
NameCount : integer;
DispIDs : array [0..2] of Integer;
WideNames : array of WideString;
I : Integer;
Names, Src : PAnsiChar;
N : array [0..2] of PAnsiChar;
begin
pDisp := CreateOleObject (edtPrgID1.Text);
if VarIsNull (pDisp) or VarIsEmpty (pDisp) then
Exit;
//-=-
NameCount := 3;
Names := 'doF4' + #0 + 'doF5' + #0 + 'doF6' + #0;
//-=-
SetLength (WideNames, NameCount);
Src := Names;
for I := 0 to NameCount - 1 do
begin
if I = 0 then
WideNames [I] := UTF8ToWideString (Src)
else
WideNames [NameCount - I] := UTF8ToWideString (Src);
Inc (Src, StrLen (Src) + 1);
end;
intResult := pDisp.GetIDsOfNames (GUID_NULL, WideNames, NameCount, LOCALE_SYSTEM_DEFAULT, @DispIDs);
我正在尝试使用自己的ActiveX COM(DLL)组件。所有方法100%存在且有效。
我不知道为什么,但是在 DispIDs 我总是得到第一种方法的结果(在我的样本“doF4”中),对于所有其他方法,我得到-1。 因此, pDisp.GetIDsOfNames 后的 DispID 看起来像(205,-1,-1)。
答案 0 :(得分:3)
您必须为每种方法拨打GetIDsOfNames()
一次。 The documentation在输出参数的描述中解释了为什么:
第一个元素代表成员名称。后续元素代表成员的每个参数。
所以要获得三个成员的ID,而不是一个成员和两个参数,你需要调用它三次。