2010-02-16 14 views
5

Proviamo a passare una stringa da un programma Delphi nativo a una DLL Prisma di Delphi. Non abbiamo problemi a passare interi, ma le stringhe non corrispondono nella DLL. Abbiamo visto Robert Love's code snippet in risposta a un'altra domanda, ma non esiste un codice per il programma Delphi nativo.Come posso passare una stringa Delphi a una DLL Prism?

Come possiamo passare le stringhe da Delphi a una DLL Delphi Prism?

+3

Questa è una comunità, quindi non dovresti rivolgerti a una singola persona nella tua domanda. Se vuoi farlo scrivi un commento alla sua risposta. Se scrivi una domanda (che è meglio in questo caso), prova a formularla nel modo più generale possibile. – jpfollenius

+0

concordato. Robert Giesecke ha risposto a questo meglio di quanto avrei potuto. –

risposta

1

Le stringhe in Delphi Win32 sono gestite in modo diverso dalle stringhe in .Net, quindi non è possibile passare una stringa .Net a Delphi Win32 o viceversa.

Per scambiare i valori delle stringhe è preferibile utilizzare il tipo PChar supportato da entrambi i compilatori. È lo stesso modo in cui si inviano valori stringa alle funzioni API di Windows.

Saluti

P.S. Io NON sono Robert ;-)

+0

Siamo spiacenti, questo dovrebbe essere un messaggio all'autore dello snippet di codice menzionato sopra. Pulsante sbagliato cliccato. Ma comunque, come funziona utilizzare PChar. Il prisma Delphi non ha un tipo PChar. se uso pchar in delphi nativo e stringa in prisma, ottengo il primo carattere a destra. Ma solo un carattere. Come risolvere il problema? –

+1

Non preoccuparti, Marcus. Non hai ancora abbastanza punti reputazione, quindi non saresti stato in grado di pubblicare un encomio sulla domanda di qualcun altro. È una domanda legittima. L'ho modificato per te, quindi non sembra che tu stia cercando di inviare un messaggio diretto, che Stack Overflow non supporta. –

+0

PChar è semplicemente un puntatore a un carattere, per inviare una stringa come quella che prima deve puntare al primo carattere, e in secondo luogo, specificare la lunghezza dei dati di stringa, in modo che l'altra estremità possa leggere i dati dal punto iniziale fino a la lunghezza della corda. Se la funzione DLL restituisce qualsiasi valore di stringa, l'altra estremità dovrebbe fornire uno spazio di memoria e inviare il suo indirizzo iniziale e la sua lunghezza alla funzione in modo che la funzione possa scrivere i dati di output in quello spazio di memoria. – vcldeveloper

8

Il modo migliore sarebbe utilizzare WideString.

Per diversi motivi.

  • Si tratta di Unicode e funziona prima D2009
  • E 'la memoria è gestita in ole32.dll, in modo da nessuna dipendenza su entrambi gestore di memoria di Delphi o CLR GC.
  • Non avere a che fare direttamente con i puntatori

In Oxygene, si potrebbe scrivere in questo modo:

type 
    Sample = static class 
    private 
    [UnmanagedExport] 
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String; 
         [MarshalAs(UnmanagedType.BStr)]out output : String); 
    end; 

implementation 

method Sample.StringTest(input : String; out output : String); 
begin 
    output := input + "ä ~ î 暗"; 
end; 

"MarshalAs" racconta la CLR come effettuare il marshalling stringhe avanti e indietro. Senza di esso, le stringhe vengono passate come Ansi (PAnsiChar), che è probabilmente NON cosa si vorrebbe fare.

Questo è come usarlo da Delphi:

procedure StringTest(const input : WideString; out output : WideString); 
    stdcall; external 'OxygeneLib'; 

var 
    input, output : WideString; 
begin 
    input := 'A b c'; 
    StringTest(input, output); 
    Writeln(output); 
end. 

Inoltre, mai e poi mai tipi di utilizzo, che non sono chiaramente definiti, per le interfacce esterne. Non è necessario utilizzare PChar per importazioni o esportazioni DLL. Perché se lo fai, ti imbatterai in eccezioni quando lo compili con D7 o D2009 (a seconda di quale fosse il sistema di sviluppo originale)

Problemi correlati