Domanda

Data la seguente funzione C in una DLL:

char * GetDir(char* path );

Come vorresti P / Invocare questa funzione in C # e eseguire il marshalling del carattere * correttamente. .NET sembra sapere come fare LPCTSTR ma quando non riesco a capire alcun marshalling che non provoca l'attivazione di NotSupportedException quando si chiama questa funzione.

È stato utile?

Soluzione

La risposta di OregonGhost è corretta solo se il carattere * restituito da GetDir è allocato in HGlobal o LocalAlloc. Non ricordo quale, ma CLR supporrà che qualsiasi tipo di ritorno stringa da una funzione PInvoke sia stato allocato con l'uno o l'altro.

Un modo più efficace è digitare il ritorno di GetDir come IntPtr. Quindi è possibile utilizzare una qualsiasi delle funzioni Marshal.PtrToStringAnsi per ottenere un tipo di stringa. Ti dà anche la flessibilità di liberare la stringa nel modo che preferisci.


[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);

Puoi darci qualche altro suggerimento sul comportamento di GetDir? Modifica la stringa di input? Come viene allocato il valore che viene restituito? Se puoi fornire che posso dare una risposta molto migliore.

Altri suggerimenti

Prova

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);

stringa viene automaticamente eseguita il marshalling su una stringa con terminazione zero e, con la proprietà CharSet, dici al Marshaller che dovrebbe usare ANSI piuttosto che Unicode. Nota: utilizzare string (o System.String) per un carattere const *, ma StringBuilder per un carattere *.

Puoi anche provare MarshalAs, come in questo esempio .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top