0

ご挨拶!

プログラムに COM ActiveX モジュールを作成することについて疑問に思いました。これは、必要に応じて昇格された特権で呼び出されます。

Delphi XE5 と Windows 8.1 Pro x64 を使用してこれらすべてを行うには。

ActiveXライブラリ化、COMオブジェクト追加、テスト機能追加。[実行] > [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 から法を提供するように要求が送信されたので、[はい] をクリックします。

その後、「クラスが登録されていません」というエラー。

私は何を間違っていますか?結局のところ、ほぼすべてが把握されており、細かいディテールが残っている可能性があります。

PS

一般に、COM オブジェクトをシステムに登録せずに DLL ライブラリから呼び出して、昇格を要求することは可能ですか? そのため、LN の方がはるかに簡単で、他の何らかの問題を自動的に解決できます。

4

0 に答える 0