現在、VBラッパークラスを介してアクセスされ(1つの関数のみ)、C#クラスから呼び出されている既存のCOMDLLがあります。
C#コードにコールバックを追加しようとしています(4つの個別のコールバック)。私が選んだアプローチは私が見つけた唯一のアプローチですが、問題があります。
「DLL'xxxx'で'InitDotNet'という名前のエントリポイントが見つかりません。
私のDLLヘッダーファイル:
extern "C"
{
#define DLL __declspec(dllexport)
typedef void (__stdcall * CB_func1)(int);
typedef void (__stdcall * CB_func2)(char *);
DLL void InitDotNet(CB_func1 func1, CB_func2 func2);
}
...
class CComInterface : public CCmdTarget
...
afx_msg void mainCall(short parm1, LPCTSTR parm2);
...
私のDLLC++ファイル:
...
CB_func1 func1Function;
CB_func2 func2Function;
...
IMPLEMENT_DYNCREATE(CComInterface, CCmdTarget)
...
BEGIN_DISPATCH_MAP(CComInterface, CCmdTarget)
DISP_FUNCTION(CComInterface, "mainCall", mainCall, VT_EMPTY, VTS_I2 VTS_BSTR)
END_DISPATCH_MAP()
...
IMPLEMENT_OLECREATE(CComInterface, "MyDll.Interface", ...)
...
void CComInterface::mainCall(short parm1, LPCTSTR parm2)
{
...
// at various times call func1Functoin and func2Function
...
}
DLL void InitDotNet(CB_func1 func1, CB_func2 func2)
{
func1Function = func1;
func2Function = func2;
}
私のVBラッパーは次のようになります。
Public Class MyWrapperClass
Private Shared Protocol As Object = CreateObject("MyDll.Interface")
Public Shared Sub mainCall(ByVal parm1 As Short, ByVal parm2 As String)
Protocol.mainCall(parm1, parm2)
End Sub
End Class
私のC#コードは次のようになります。
...
using System.Runtime.InteropServices
namespace MyNamespace
{
public partial class MyForm : AnotherForm
{
...
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void func1Callback(int value);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void func2Callback(string value);
[DllImport("mycppdll.dll")]
public static extern void InitDotNet([MarshalAs(UnmanagedType.FunctionPtr)] func1Callback f1c,
[MarshalAs(UnmanagedType.FunctionPtr)] func2Callback f2c);
...
private void MyFunc()
{
func1Callback f1c =
(value) =>
{
// work here
};
func2Callback f2c =
(value) =>
{
// work here
};
InitDotNet(f1c, f2c);
MyWrapperDll.MyWrapperClass.mainCall(1, "One");
}
誰かが私が間違っていることについて何か考えがありますか?