P/Invoke-Problem (once again)

05/09/2008 - 15:18 von Thorsten Kleibaum | Report spam
Hallo zusammen,

ich hoffe, mit meiner Frage nicht schon wieder einen Streit wie am
Montag auszulösen, aber ich habe noch mal ein Problem mit P/Invoke.

Es geht wieder um einen LPSTR, nur diesmal soll dies laut Spezifikation
der unmanaged DLL ein "Pointer to buffer" sein, der an die unmanaged
Methode übergeben wird und durch diese gefüllt wird.

Die Spezifikation sieht folgendermaßen aus:
long CCC_GetInventoryList(LPSTR inventory)

Ich habe dies folgendermaßen versucht umzusetzen

private static extern int
CCC_GetInventoryList([MarshalAs(UnmanagedType.LpStr)] out string
inventory)

erhalte so jedoch eine AccessViolationException und ohne "out" bleibt
der String leer.

Sicherlich habt Ihr einen Tip für mich; aber bitte seid nett zueinander.
;)

Gruß
Thorsten

@ Thomas, Frank, Herfried und Maximilian
P.S.: Bzgl. des Threads vom Montag habe ich einfach mal experimentiert:
der Aufruf der unmanaged Methode erfolgt offenbar immer korrekt, egal ob
ich CharSet=CharSet.Auto und/ oder MarshalAs einsetze oder nicht. Selbst
ganz ohne die beiden bekomme ich von der Methode '0' zurückgeliefert und
mehr will ich ja gar nicht. Sicherheitshalber habe ich aber das
MarshalAs-Attribut dringelassen.
So viel als Nachtrag - aus allem anderen halte ich mich dezent raus, da
mir zum Mitreden das Hintergrundwissen fehlt.
 

Lesen sie die antworten

#1 Andreas Bürstner
05/09/2008 - 15:27 | Warnen spam
Hallo Thorsten,

mit einer Stringbuider-Instnz sollte es funktionieren.

Gruß
Andreas

"Thorsten Kleibaum" wrote:

Hallo zusammen,

ich hoffe, mit meiner Frage nicht schon wieder einen Streit wie am
Montag auszulösen, aber ich habe noch mal ein Problem mit P/Invoke.

Es geht wieder um einen LPSTR, nur diesmal soll dies laut Spezifikation
der unmanaged DLL ein "Pointer to buffer" sein, der an die unmanaged
Methode übergeben wird und durch diese gefüllt wird.

Die Spezifikation sieht folgendermaßen aus:
long CCC_GetInventoryList(LPSTR inventory)

Ich habe dies folgendermaßen versucht umzusetzen

private static extern int
CCC_GetInventoryList([MarshalAs(UnmanagedType.LpStr)] out string
inventory)

erhalte so jedoch eine AccessViolationException und ohne "out" bleibt
der String leer.

Sicherlich habt Ihr einen Tip für mich; aber bitte seid nett zueinander.
;)

Gruß
Thorsten

@ Thomas, Frank, Herfried und Maximilian
P.S.: Bzgl. des Threads vom Montag habe ich einfach mal experimentiert:
der Aufruf der unmanaged Methode erfolgt offenbar immer korrekt, egal ob
ich CharSet=CharSet.Auto und/ oder MarshalAs einsetze oder nicht. Selbst
ganz ohne die beiden bekomme ich von der Methode '0' zurückgeliefert und
mehr will ich ja gar nicht. Sicherheitshalber habe ich aber das
MarshalAs-Attribut dringelassen.
So viel als Nachtrag - aus allem anderen halte ich mich dezent raus, da
mir zum Mitreden das Hintergrundwissen fehlt.




Ähnliche fragen