1

ATL を使用して作成された COM オブジェクトがあります (MFC サポートなし)

オブジェクトには、ダイアログを開く 1 つのメソッドがあります (残りのすべてを実行します)。

現在、別のEXEから呼び出しています:

hr = CoCreateInstance(
    CLSID_MyControl,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IMyControl,
    (void**) &pMyControl
    );

その後:

hr = pMyControl->MyMethod (ATL::CComBSTR(InputString1), ATL::CComBSTR(InputString2), &IntReturned, &IntReturned);

ブラウザからそのまま呼び出すことはできますか?

オブジェクトをインスタンス化し、ブラウザからメソッド (パラメータを使用) を呼び出すにはどうすればよいですか?

4

1 に答える 1

3

あなたの質問に答えるいくつかのポイント:

  • IE またはWebBrowserベースのアプリ以外のブラウザーでは COM オブジェクトを使用できません。

  • IE がオブジェクトを作成できるようにするには、IObjectSafetyインターフェイスを実装する必要があります。当然のことながら、オブジェクトは、信頼できないソースによるスクリプトに対して安全である必要があります。理想的には、オブジェクトを独自のサイト リストにロックする必要があります。これにはSiteLockテンプレートを使用できます。

  • オブジェクトはIDispatch、スクリプトで使用できるようにインターフェイスを実装する必要があります。最善の方法は、ATL を使用することですIDispatchImpl(ほとんどの場合、コードで既に実行されています)。

  • MyMethodサンプルのは、 に 2 つの[out]引数を使用しますIntReturned。JavaScript は、1 つの出力[out, retval]引数のみを許可します。複数の値を返す必要がある場合は、VBScript を使用する必要があります。

例 (CLSID に置き換えてください):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<html>
<head>
    <title></title>
    <script type="text/vbscript">
        Option Explicit
        window.onload = GetRef("OnLoadHandler")

        Sub OnLoadHandler
            Dim InputString1
            Dim InputString2
            Dim IntReturned1
            Dim IntReturned2

            InputString1 = "a"  
            InputString1 = "b"  
            testObject.MyMethod InputString1, InputString2, IntReturned1, IntReturned

            alert "Result: " & IntReturned1 & ", " & IntReturned
        End Sub
    </script>
</head>

<body>
    <object id="testObject" classid="clsid:12345678-1234-1234-1234-1234567890AB">
        <span>Unable to create the object.</span>
    </object>
</body>
</html>

を実装しない場合IObjectSafetyでも、このコードを HTML アプリケーションとして実行できます。.HTA ファイルとして保存し、C:\Windows\SysWOW64\mshta.exe C:\users\user\Documents\test.htaC++ COM DLL が 32 ビットまたはC:\Windows\System32\mshta.exe C:\users\user\Documents\test.hta64 ビットであるかのように実行します。

最初に COM DLL を登録する必要がありますregsvr32.exe(C++ クライアント プロジェクトから使用できる場合は、既にこれを行っている可能性があります)。

于 2013-10-12T02:24:38.203 に答える