| Dario Cerizza |
doppi puntatori
Ciao a tutti
Sto utilizzando pinvoke per wrappare alcune funzioni di una dll di una smartcard. Mi sono ritrovato con un metodo che ha la seguente signature: int CpkiSignData( char* DataToSign, char** dataSigned, int DataLength, int* DataSignedLength, char* password, CpkiStatus Env) Per quanto riguarda il char* penso di cavarmela con: [MarshalAs(UnmanagedType.LPStr)]string dataToSign ma come mi comporto con il char** ? dato che il doppio puntatore è usato dalla funzione per ritornarmi una stringa che alloca al suo interno, ho pensato di usare la keyword ref: [MarshalAs(UnmanagedType.LPStr)]ref string dataSigned, Il wrapper finale diventa quindi: [DllImport("CpkiWin32.dll")] public static extern short CpkiSignData( [MarshalAs(UnmanagedType.LPStr)]string dataToSign, [MarshalAs(UnmanagedType.LPStr)]ref string dataSigned, short dataLength, ref short dataSignedLength, [MarshalAs(UnmanagedType.LPStr)]string password, IntPtr env); Naturalmente non funziona ma non ottengo eccezzioni se non un errore generico di ritorno dalla funzione. Purtroppo non riesco capire se è un problema del wrapper oppure interno della dll. Sapete dirmi se il mio procedimento per la creazione del wrapper è corretto ? ho alcuni dubbi sul come faccia .NET a sapere la lunghezza della string di ritorno se questa lunghezza la scrive la dll in un altro parametro della funzione (dataSignedLength). Dite che è meglio usare array di char ? Grazie 1000 come sempre ciao |
| WIlliam Franchini |
Re: doppi puntatori
Usa StringBuilder per rappresentare un parametro output di tipo stringa.
ciao William |