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# プログラミングの経験が豊富な人が、その翻訳が正しいか間違っているかを確認できれば、役立つかもしれません。