19 Stimmen

Wie wird SIZE_T* richtig eingeordnet?

Ich habe die folgende C++-Funktionsdefinition, die ich versuche, über PInvoke aus verwaltetem Code aufzurufen:

bool FooBar(SIZE_T* arg1);

Meine verwaltete Erklärung sah wie folgt aus:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);

Einige von Ihnen werden vielleicht denselben Fehler bemerken, den ich schließlich auch hatte. Dies ist nicht 64bit portabel. SIZE_T ist von variabler Größe (32-64 Bit), ebenso wie der Zeiger auf sie. Bei der verwalteten Größe wird der Zeiger korrekt in 64bit übersetzt, aber der uint nicht, und man kann mit Müll in den oberen Bits von arg1 enden. Dies war ein besonders hartnäckiger Fehler, da der Müll oft nur aus Nullen bestand :(

Die einzige Lösung, die ich zum Funktionieren gebracht habe, ist die folgende verwaltete Erklärung:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);

Das funktioniert natürlich, weil IntPtr seine Größe korrekt variieren kann. In meinem Code behandle ich IntPtr einfach als Integer, und es funktioniert, obwohl es wie ein hässlicher Hack aussieht. Es scheint mir, es sollte eine Möglichkeit geben, dies richtig zu spezifizieren, vielleicht mit UnmanagedType.SysUInt, aber ich habe nicht in der Lage gewesen, mit einer anderen funktionierenden Lösung zu kommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X