Marshalling un una matrice non gestita di stringhe da un PInvoked OpenFileDialog (GetOpenFileName)
-
21-08-2019 - |
Domanda
OpenFileDialog restituisce un puntatore alla memoria contenente una sequenza di stringhe null-terminate, seguita da nullo finale per indicare la fine della matrice.
Questo è come mi sto C # stringhe indietro dal puntatore non gestito, ma sono sicuro che ci deve essere un modo più sicuro più elegante.
IntPtr unmanagedPtr = // start of the array ...
int offset = 0;
while (true)
{
IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset );
string name = Marshal.PtrToStringAuto(ptr);
if(string.IsNullOrEmpty(name))
break;
// Hack! (assumes 2 bytes per string character + terminal null)
offset += name.Length * 2 + 2;
}
Soluzione
quello che stai facendo sembra piuttosto buono -. L'unico cambiamento che vorrei fare sarebbe quella di utilizzare Encoding.Unicode.GetByteCount(name)
invece di name.Length * 2
(è solo più evidente quello che sta succedendo)
Inoltre, si potrebbe desiderare di utilizzare Marshal.PtrToStringUni(ptr)
se si è certi che i vostri dati non gestito è Unicode, in quanto rimuove ogni ambiguità circa la codifica della stringa.