Newsgroup: it.comp.lang.visual-basic
Titolo: [OT ?] Creare una DLL in VC che restituisca una stringa

Dal sito comune ho scaricato l'articolo "Creare una DLL in C per Visual
Basic" che dimostra (in maniera veloce) come creare una dll in VC e gestirla
in VB. Il tutto funziona perfettamente finchè la mia Funzione nella DLL ha
dovuto restituirmi una stringa... Come fare? VC gestisce le stringhe in
maniera differente rispeto al VB e la funzione mi manda in crash l'IDE...
Ecco qua la funzione:
extern "C" __declspec (dllexport) char* __stdcall ReturnStringa(){
    return "PIPPO\0";
}// ReturnStringa
Dove sbaglio???
Questa è la dichiarazione in VB:
Private Declare Function ReturnStringa Lib "Test2.dll" Alias
"_ReturnStringa@0" () As String
L'alias l'ottengo con Dependency Walker.
Grazie a tutti!
SebaMix
P.S. Ho chiesto un po' ovunque, anche su NG C++ e ho provato a spulciarmi
l'MSDN ma... :(
--
Sebastiano Pallaro
--
Sito lavoro : 
http://www.infotrade.it
Sito personale : 
http://sebamix.supereva.it
Sito Comune del NG it.comp.lang.visual-basic : 
http://www.it-lang-vb.net
Per scrivermi : togliete ".ot" dall'indirizzo di posta elettronica
--

L'alias l'ottengo con Dependency Walker.
ma non potresti o restituire l' indirizzo di un buffer o, meglio ancora, imho,
aggiungere un parametro in/out per il buffer come si usa con le funzioni
dell' api ?
Es.
Private Declare Function ReturnStringa Lib "Test2.dll"  _
                              (ByVal lpString As String) As Long
dove ti ritorni per comodita' lunghezza della stringa scritta nel buffer.
ciao, hal

 ha scritto nel messaggio
news:9eubtt$16sl6$1...@ID-56381.news.dfncis.de...
[...]



LPTSTR GetCommandLine( );
Questo e' un esempio di funzione C che restituisce una stringa.
Una strcpy finale, ritornando il puntatore restituito da questa anziche' il
puntatore a quello che immagino essere un array allocato come
char s[1024];
o qualcosa del genere, dovrebbe risolvere il problema.
Non si garantiscono ovviamente i risultati :)
Ultima annotazione: VB si aspetta una stringa ANSI, che converte e copia al
volo nel momento in cui la riceve, percui provvede anche a una free() del
puntatore ritornato dalla strcpy().
Ovviamente passare puntatori a stringhe da C a VB non e' pratica
raccomandata da M$ :)
Ciaotutti,
Asterix

Faccio così:
Private Declare Function ReturnStringa2 Lib "Test2.dll" Alias
"_ReturnStringa2@4" (ByRef buffer As String) As Long
Private Sub Command3_Click()
    Dim buffer As String
    Dim lBuffSize As Long
    buffer = Space(255)
    lBuffSize = ReturnStringa2(buffer)
    MsgBox Left(buffer, lBuffSize) & " " & lBuffSize
End Sub
// Questa è la mia prova... :)
extern "C" __declspec (dllexport) int __stdcall ReturnStringa2(LPSTR
buffer){
 strcpy (buffer , "PIPPO\0" );
 return strlen(buffer);
}// ReturnStringa
Ma non va... possibile che nessuno possa postare un po' di codice
funzionante??? Su MSDN l'unico articolo che ho trovato è del '97 e parla di
VB 3 e VC 3... :( Please... sono disperato...
CiaoZ
SebaMix


[...]


 Private Sub Command3_Click()
[...]

 Alfonso
Ora funziona... grazie!
Scusa ma sono 2 giorni che in 2 cerchiamo un po' dappertutto... :(  e
l'altra persona è decisamente più esperta di me... :)
Comunque funzia... ora riesco a leggere "PIPPO" :::)))
CIaoZ
SebaMix

 Alfonso
Che e' leggermente diverso da quanto ho detto io. Inoltre la tua proposta
finale era totalmente diversa, mentre la soluzione che ho proposto io
passava indietro un puntatore vero a memoria appena allocata anziche'
modificare un puntatore a memoria allocata da sopra.
Il problema della memoria allocata da sopra e' che devi sempre farti passare
anche la dimensione del buffer e stare attento a non eccederla, mentre se
allochi tu il buffer puoi farlo grande quanto vuoi.
Ad ogni modo, la soluzione della 'memoria allocata da sopra' e' generalmente
preferita per questo tipo di chiamata, anche perche' lascia  al chiamante un
notevole controllo della gestione memoria.
Ciaotutti,
Asterix

 As Long
Aggiungi al tuo progetto in VC++ un file di testo che chiamerai
Test2.def
in questo file aggiungi queste righe:
EXPORTS
    ReturnStringa2
In questa maniera la funzione verra' esportata con il nome
ReturnStringa2 e potrai cambiare la dichiarazione in:
Private Declare Function ReturnStringa2 Lib "Test2.dll" (ByRef
buffer As String) As Long
Ciao.

"H.P.L." <u...@vaila.ble> wrote in message
news:haSQ6.8152$HK.4...@news.infostrada.it...

E anche cambiare la dichiarazione del parametro in (WCHAR ** sIOParam)
Dato che se lo passa ByRef passa il **.
E a questo punto dovra' anche stare attento a getsire il fatto che  in VB le
stringhe hanno, nella dword prima del puntatore, la lunghezza della stringa.
Ora pero' non mi ricordo se la struttura sia
DWORD lStrLen
WCHAR ** lpStrPtr
oppure
DWORD lStrLen
WCHAR * lpStr
La differenza? lpStrPtr e' il puntatore che riceve ByRef, percui per
mantenere aggiornato VB sui cambiamenti effettuati nonche' conoscere la
reale dimensione del buffer dovrebbe trattare la locazione a sIOParam - 4,
lpStr e' il puntatore a cui lpStrPtr indirizza, percui.per leggere e
scrivere la lunghezza del buffer dovrebbe trattare la locazione a
[lpStrPtr] - 4, perdonatemi la notazione assembly ma non ricordavo la
notazione C :)
La notazione VB, per la cronaca, non esiste, dato che VB non tratta i
puntatori :PP
Ciaotutti,
Asterix