Ich denke, ich habe im Grunde verstanden, wie C# Delegaten für Rückrufe zu schreiben, aber diese verwirrte mich. Die C++ Definition lautet wie folgt:C# Delegate für C++ Callback
typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam
);
und mein C# Ansatz wäre:
unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);
Obwohl dies nicht korrekt zu sein scheint, weil ich einen PInvokeStackInbalance Fehler, die meine Definition des Delegierten bedeutet ist falsch.
Der Rest der Parameter der Funktion sind Zeichenfolgen oder Ints, was bedeutet, dass sie den Fehler nicht verursachen können, und wenn ich nur ein IntPtr.Zero anstelle des Delegaten übergebe (was bedeuten würde, dass ich auf eine nicht Callback-Funktion) bekomme ich einen AccessViolation-Fehler, der auch Sinn macht.
Was mache ich falsch?
EDIT:
Die volle C++ Funktion ist:
int
__stdcall
_Initialize (
const char* FileName,
Callback cbFunction,
int Code,
const char* Name,
unsigned int Option,
unsigned int Option2
);
Meine C# -Version ist:
[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);
Die Funktion (zum Testen) ist gerade innerhalb der Hauptroutine aufgerufen eine Konsolenanwendung:
static void Main(string[] args)
{
CallbackDelegate del = new CallbackDelegate(onCallback);
Console.Write(_Initialize("SomeFile.dat", del, 1000, "", 0, 4));
Console.Read();
}
wo onCallback
ist dies:
static int onCallback(int lCode, int lParamSize, IntPtr pParam)
{
return 0;
}
Ich erhalte die PInvokeStackInbalance
Fehler auf der Linie, wo ich _Initialize
nennen, wenn ich einen IntPtr.Zero
anstelle des Delegaten übergeben, und die Definition der Funktion IntPtr
ändern statt CallbackDelegate
dann Ich bekomme eine AccessViolationException
.
'Der Rest der Parameter der Funktion sind Strings oder Ints'. Verstecken Sie keine Informationen. –
Haben Sie versucht, nicht unsicher zu verwenden? d. h.: Delegat int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam); – DougEC
@HansPassant Ich versuche nicht, Informationen zu verstecken, ich habe versucht, Dinge wegzulassen, die ich für nicht relevant hielt. Ich werde die Frage bearbeiten und die Informationen hinzufügen. – Valandur