2

C# で記述された ActiveX コントロールがあり、ActiveX 互換プログラム (CoDeSys) で実行すると動作します。私が遭遇した問題は、CoDeSys が ActiveX コントロールとやり取りできるようにするために、CoDeSys が dll に関数プロトタイプをエクスポートする必要があることです。

void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag);

次の例に示すように、C++ でできるようにこれをエクスポートする方法を調べましたが、成功しませんでした。

extern "C" __declspec (dllexport) void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag)
{
  if (strcmp(pszId, "IWebBrowser|GoBack") == 0)  
  {
    IUnknown* pNewUnk;
    IWebBrowser* pwb;
    pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk);
    pwb = (IWebBrowser*) pNewUnk;

    if (pwb)
    {
      pwb->GoBack();
      pwb->Release();
    }
  }
  else if (strcmp(pszId, "IWebBrowser|GoForward") == 0)
  {
    IUnknown* pNewUnk;
    IWebBrowser* pwb;
    pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk);
    pwb = (IWebBrowser*) pNewUnk;

    if (pwb)
    {
      pwb->GoForward();
      pwb->Release();
    }
  }
}

C# にはexternキーワードがありますが、関数定義を提供することはできません (少なくとも方法は見つかりませんでした)。これを試みた後:

extern unsafe void ExecuteActiveXCall(
        [MarshalAs(UnmanagedType.IUnknown)] object pUnk, 
        char* pszId, 
        char* pszParam,
        char* pszReturnBuffer, 
        int nReturnBufferSize,
        UInt32* pdwReturnFlag)
    {

    }

次のエラーが発生します。

'AlarmsCSharp.AlarmsControl.ExecuteActiveXCall(object, char*, char*, char*, int, uint*)' cannot be extern and declare a body

C# dll で関数をエクスポートしようとした人はいますか?

回避策はありますか? (私は[DllImport("AlarmsCSharp.dll")]と C++ dll で C# を呼び出すことを考えていましたが、以前に誰かが解決策を持っているかどうかを確認したいと思いました)

ActiveX コントロールは既に C# コードとやり取りできるため、この関数をエクスポートする必要はありません。

編集: C++ 関数プロトタイプから C# インターフェイス宣言への変換を感じています。C++/C# プログラミングの経験が豊富な人が、その翻訳が正しいか間違っているかを確認できれば、役立つかもしれません。

4

2 に答える 2

0

あなたは、CoDeSys は ActiveX と互換性があると言っています。COM相互運用機能を試してみましたか?

于 2010-10-29T18:06:09.047 に答える
0

3 つの主なオプションがあるようです。1 つ目は、COM を使用して C# コントロール/クラスをインスタンス化できる COM 相互運用機能をセットアップすることです。色々と検索していただければ、そのあたりの情報が得られると思います。

2 番目のオプションは、ここで説明されているように、C++ モジュールをマネージド/アンマネージドを混在させることです

3 番目のオプションは、http: //tigerang.blogspot.com/2008/09/reverse-pinvoke.htmlで説明されているように、「リバース PInvoke」を使用することです。

他のオプションがあるかもしれません。それらは私が知っているものです。

于 2011-05-28T18:09:11.677 に答える