COM Elevation Moniker

时间:2014-02-04 09:56:57

标签: delphi uac elevation moniker

问候!

想知道如何为程序创建COM ActiveX模块,必要时可以使用提升的权限调用它。

使用Delphi XE5和Windows 8.1 Pro x64完成所有这些操作。

制作ActiveX库,添加了COM对象,添加了测试功能。在系统中注册,使用Run> ActiveX服务器 - >寄存器。 手术很成功。

这是我的图书馆有一个GUID:

  LIBID_libCOM: TGUID = '{B6D13396-71C2-4503-B314-65E72F176413}';
  IID_ITestOBJ: TGUID = '{0FD34325-6654-4DC4-9537-11CAA5B25652}';
  CLASS_TestOBJ: TGUID = '{1FDCEE9D-E747-4616-9D00-D55D7FD26B03}';

对象界面:

  ITestOBJ = interface (IUnknown)
    ['{0FD34325-6654-4DC4-9537-11CAA5B25652}']
    function GetSum (S1: HResult; S2: HResult): HResult; stdcall;
  end;

如果你以通常的方式打电话,那么它可行:

var
 II, TOBJ: ITestOBJ;
begin
 II: = CoTestOBJ.Create;
 II.QueryInterface (ITestOBJ, TOBJ);
ShowMessage (IntToStr (TOBJ.GetSum (StrToInt (Edit1.Text), StrToInt (Edit2.Text))));
end;

之后我添加到注册表LocalisedString,Elevation \ Enabled,Elevation \ IconReference

接下来,调用代码:

var
 z: ITestOBJ;
 hr: HRESULT;

 BO: BIND_OPTS3;
 MonikerName: WideString;
begin
 hr: = 0;
 z: = nil;

 MonikerName: = 'Elevation: Administrator! New:' + GUIDToString (CLASS_TestOBJ);
 FillChar (BO, SizeOf (BIND_OPTS3), 0);

 BO.cbStruct: = SizeOf (BIND_OPTS3);
 BO.dwClassContext: = CLSCTX_LOCAL_SERVER;
 BO.hwnd: = Self.Handle;

 hr: = CoGetObject (PWideChar (MonikerName), @ BO, ITestOBJ, @ z);



 OleCheck (hr);

 ShowMessage (IntToStr (z.GetSum (1, 2)));
end;

请求来自UAC提供法律,我点击是。

之后,出现错误“Class not registered”。

我做错了什么?毕竟,几乎所有人都想到了,可能仍然是小细节!

P.S。

通常,可以从DLL库中调用COM对象而无需在系统中注册它并请求提升? 因此,LN更容易,并且会自动解决某些其他问题。

0 个答案:

没有答案