Logo UGIdotNET

Discussione 'doppi puntatori'

# Pubblicato il 12 nov 2003 13.44 - Rispondi
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
# Pubblicato il 12 nov 2003 18.44 - Rispondi
WIlliam Franchini
Re: doppi puntatori
Usa StringBuilder per rappresentare un parametro output di tipo stringa.

ciao
William

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185