Hallo Experten,
ich nutze eine vorcompilierte dll. Eine der Funktionen daraus erwartet eine Callback-Funktion als parameter. Das sagt die Doku:
[highlight=c++]INT32 SICD_IntEnable(FUNCPTR inthandlerfunc);[/highlight]Dazu gibt es eine Beispielapplikation in C++. Dort wird die Funktion wie folgt benutzt:[highlight=c++]#define CALLBACK __stdcall
typedef void (__stdcall *FUNCPTR)(long par1, long par2, long par3);
void CALLBACK FSICAM_IRQCallback( DWORD dwFrameCnt, DWORD dwMemFlg, DWORD dwReserved )
{
// body
}
nRet = SICD_IntEnable( ( FUNCPTR )FSICAM_IRQCallback );
[/highlight]
Ich möchte weiterhin C# benutzen und versuchte das:[highlight=c#]delegate void CallbackDelegate(int par0, int par1, int par2);
[DllImport("SonyICam", CharSet = CharSet.Ansi, SetLastError = false)]
private static extern int SICD_IntEnable(CallbackDelegate ImagePendingDelegate);
void ImagePending(int par0, int par1, int par2)
{
// body
}
try { IreturnValue = SICD_IntEnable(ImagePending); }[/highlight]Das funktioniert zumindest so weit, dass ImagePending() ausgeführt wird.
Allerdings stürzt das Programm nach einiger Zeit (ca 50 x ImagePending()) ab.
Das Programm stürzt schneller ab, wenn die Parameter als long übergebe, wie es in der Doku steht.
Wie wird so ein Funktionsaufruf korrekt gehandhabt?
luker
ich nutze eine vorcompilierte dll. Eine der Funktionen daraus erwartet eine Callback-Funktion als parameter. Das sagt die Doku:
[highlight=c++]INT32 SICD_IntEnable(FUNCPTR inthandlerfunc);[/highlight]Dazu gibt es eine Beispielapplikation in C++. Dort wird die Funktion wie folgt benutzt:[highlight=c++]#define CALLBACK __stdcall
typedef void (__stdcall *FUNCPTR)(long par1, long par2, long par3);
void CALLBACK FSICAM_IRQCallback( DWORD dwFrameCnt, DWORD dwMemFlg, DWORD dwReserved )
{
// body
}
nRet = SICD_IntEnable( ( FUNCPTR )FSICAM_IRQCallback );
[/highlight]
Ich möchte weiterhin C# benutzen und versuchte das:[highlight=c#]delegate void CallbackDelegate(int par0, int par1, int par2);
[DllImport("SonyICam", CharSet = CharSet.Ansi, SetLastError = false)]
private static extern int SICD_IntEnable(CallbackDelegate ImagePendingDelegate);
void ImagePending(int par0, int par1, int par2)
{
// body
}
try { IreturnValue = SICD_IntEnable(ImagePending); }[/highlight]Das funktioniert zumindest so weit, dass ImagePending() ausgeführt wird.
Allerdings stürzt das Programm nach einiger Zeit (ca 50 x ImagePending()) ab.
Das Programm stürzt schneller ab, wenn die Parameter als long übergebe, wie es in der Doku steht.
Wie wird so ein Funktionsaufruf korrekt gehandhabt?
luker