德尔福XE2。的ActiveX。如何调用GetIDsOfNames来解决几种方法的方法ID?

时间:2014-01-17 11:47:42

标签: delphi activex delphi-xe2

如何调用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)

1 个答案:

答案 0 :(得分:3)

您必须为每种方法拨打GetIDsOfNames()一次。 The documentation在输出参数的描述中解释了为什么:

  

第一个元素代表成员名称。后续元素代表成员的每个参数。

所以要获得三个成员的ID,而不是一个成员和两个参数,你需要调用它三次。