问候!
想知道如何为程序创建 COM ActiveX 模块,如有必要,将使用提升的权限调用该模块。
使用 Delphi XE5 和 Windows 8.1 Pro x64 来完成所有这些工作。
制作了ActiveX Library,添加了COM Object,添加了测试功能。在系统中注册,使用Run>ActiveX Server->Register。手术成功。
这是我的图书馆有一个 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 以提供法律,我单击是。
之后,出现“类未注册”错误。
我究竟做错了什么?毕竟几乎都想通了,很可能还是小细节!
附言
一般来说,可以从DLL库中调用COM对象而不在系统中注册它并请求提升吗?所以 LN 更容易,并且会自动解决某种其他问题。