コールバック用の C# デリゲートの書き方は基本的に理解できたと思いますが、これは私を混乱させます。C++ の定義は次のとおりです。
typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam
);
私のC#アプローチは次のようになります。
unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);
これは間違っているように見えますが、デリゲートの定義が間違っていることを意味する PInvokeStackInbalance エラーが発生するためです。
関数の残りのパラメーターは文字列または int です。つまり、エラーを引き起こすことはありません。また、デリゲートの代わりに IntPtr.Zero を渡すだけの場合 (存在しないコールバック関数を指していることを意味します)。 AccessViolation エラーが発生しますが、これも理にかなっています。
私は何を間違っていますか?
編集:
完全な C++ 関数は次のとおりです。
int
__stdcall
_Initialize (
const char* FileName,
Callback cbFunction,
int Code,
const char* Name,
unsigned int Option,
unsigned int Option2
);
私のC#バージョンは次のとおりです。
[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);
関数は (テスト用に) コンソール アプリケーションのメイン ルーチン内で呼び出されます。
static void Main(string[] args)
{
CallbackDelegate del = new CallbackDelegate(onCallback);
Console.Write(_Initialize("SomeFile.dat", del, 1000, "", 0, 4));
Console.Read();
}
これはどこonCallback
ですか:
static int onCallback(int lCode, int lParamSize, IntPtr pParam)
{
return 0;
}
デリゲートの代わりにa を渡し、関数の定義を の代わりに に変更すると、PInvokeStackInbalance
を呼び出す行でエラーが発生します。_Initialize
IntPtr.Zero
IntPtr
CallbackDelegate
AccessViolationException