Newsgroup: it.comp.lang.delphi
Titolo: VB e Delphi, stringhe e DLL

Data una funzione di questo tipo:
function Pippo(P: PChar): Integer; stdcall;
begin
  StrPCopy(P, 'Paperino');
  Result := 0;
end;
Supponendo di includerla in una DLL e quindi volerla 
agganciare da Visual Basic, qual e' la sintassi corretta
da utilizzare ?
Sto sperimentando dei problemi perche' nella mia funzione
scritta in Delphi e inclusa nella DLL io faccio affidamento
sul fatto che P punti ad una zona di memoria valida e
abbastanza grande da contenere la stringa che assegno, ma 
da VB come la utilizzo ?
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

da VB come la utilizzo ?
mi sa che devi chiedere nel NG di VB
--
Rhymes - 
rhy...@myself.com
http://www.foxhound-games.it
"Sapete cosa fa un InputStream quando
gli si racconta una barzelletta? Reader..."

 mi sa che devi chiedere nel NG di VB
Il mio dubbio e' che il problema sia con la costruzione
della DLL, per questo chiedo qui (anche considerato che
molte persone, qui dentro, utilizzano o hanno utilizzato
VB).


da VB come la utilizzo ?
Le mie DLL (che vengono usate anche da programmi C++e VB) hanno
normalmente questo tipo di dichiarazione per le stringhe:
function InitializeProc(FileName: LPCSTR): Bool; stdcall;
con, come saprai, LPCSTR = PAnsiChar
Ora, però, non ho la minima idea di come vengano chiamate in VB.
L'unica cosa che so è che funzionano ;-)
Massimo.
-----------
Ore 18.30: premo invio.


In genere quando usi una funzione DLL da VB ti comporti in questo modo:
delphi - function Pippo(P: PChar): Integer; stdcall;
VB - Declare Function Pippo Lib "MyDll.dll" (ByVal P As String) As Long
Non farti impressionare dal ByVal: una ByVal String passata a una DLL viene
semplicemente trasformata in ANSI String quando viene passata alla DLL e
ritrasformata in BSTR quando viene ricevuta nuovamente da VB.
Il problema in questo caso e' che se dichiari una stringa generica
Dim S As String
hai dichiarato soltanto un puntatore.
In genere quindi si esporta la funzione cosi':
delphi - function Pippo(P: PChar; cb: Integer): Integer; stdcall;
Che in VB diventa
VB - Declare Function Pippo Lib "MyDll.dll" (ByVal P As String, ByVal cb As
Long) As Long
Nel parametro cb passi la lunghezza della stringa, che nella funzione dovrai
verificare.
Da VB allochi la stringa con
S=Space$(200)
che crea una stringa contenente 200 spazi, null-terminated, in Unicode.
Quando chiamerai la funzione VB convertira' la stringa unicode in ANSI, la
passera' alla funzione, aspettera' il ritorno, la riconvertira' in Unicode e
inserira' il risultato nella tua stringa S.
La gestione memoria la fa tutta VB, devi solo accertarti che la stringa che
esce dalla funzione sia null-terminated.
La dimensione cb di Space$(200) da passare alla funzione e' 200.
Potresti anche passare 201, ma per sicurezza e' meglio di no :)
Se invece vuoi un puntatore a CARATTERI e non un puntatore a stringa puoi
usare la sintassi
VB - Declare Function Pippo Lib "MyDll.dll" (P As Byte, ByVal cb As Long) As
Long
Allochi un byte array e poi passi alla funzione B(0).
Dim B() As Byte
ReDim B(1024)
Pippo(B(0), 1024) ' Anche 1025 ma, come sopra, io un byte di sicurezza lo
lascerei...
Ciaotutti,
*

 S=Space$(200)
Grazie mille, era esattamente questo il punto.
Risolto dopo un bel po' di bestemmie :)


 wrote in message
43833a90c028de87b57...@mygate.mailgate.org...

- 
http://www.Mailgate.ORG


Alcuni preferiscono anche il sorgente byref as any, altri ancora fanno una
funzione per ogni tipo di dato, cmq in generale e' corretto.
Il problema e' sempre allocare memoria prima, perche' tutte le API si
aspettano di avere in ingresso memoria gia' allocata.
Ciaotutti,
*