Newsgroup: it.comp.programmare.win32
Titolo: stringhe

ciao a tutti,
io ho un problema.....
Ho fatto una DLL in VisualC++ con questa funzione:
----------------------------------------------
#include <windows.h>
__declspec(dllexport)
LPCSTR prova()
{
	LPSTR a;
	a="ciao";
	return a;
}
----------------------------------------------
nel DEF ho dichiarato la funzione, compilo e va tutto ok.
Dal Visual Basic ho richiamato il tutto:
-----------------------------------------------
Private Declare Function prova Lib "libprova" () As String
Private Sub Form_Load()
 Dim c As String
 c = prova
End Sub
-------------------------------------------------
ma come faccio partire il programma mi si blocca il visual basic e devo riavviare la macchina.
La mia domanda e':
cosa c'e' di sbagliato?
Al limite, estendendo a quello che devo fare io, come faccio a fare una funzione in una dll che ritorni una stringa alla chiamata eseguita dal visual basic?
Grazie in anticipo
Riccardo

 Riccardo
La tua funzione in C dovrebbe essere
LPCSTR WINAPI prova() { 
	.....
	}
E' un problema di come la funzione nella DLL viene compilata.
Il C utilizza un metodo differente dal Basic nell'uso dello stack per
passare i parametri della funzione.
(se dico inesattezze, correggetemi)
Con WINAPI si fa in modo che la funzione venga compilata secondo lo
stile delle API di windows e quindi importabile dal Basic.
Saluti
Luca

 Luca
Ho appena provato ma continua a bloccarsi :(
Riccardo

 
Cosi' ho provato ma quando torno al basic la variabile stringa non ha cambiato il valore, sia passata byval che byref.
Se nella funzione in C faccio 
 int prova(LPCSTR &stinga)
mi si blocca addirittura.....
Riccardo

 > }
Ma non ci vuole
*stringa = *a
??
altrimenti non copia il valore del puntatore invece che del "puntato" ?
Ciao.


In ogni modo non va... :)
Ciao

 In ogni modo non va... :)
Se aspetti stasera guardo (da casa) una mia DLL di prova che chiamo da VB.
Cosi' ti dico come fare... purtroppo a memoria non mi ricordo +....
:-(
Ciao!
SkunkGuru.

 
Ciao,
dunque... Dove e' allocata la stringa "ciao"? Quando la funzione prova 
termina, la stringa viene distrutta e chi va a leggere il puntatore 
restituito dalla funzione non sa coosa vi trova.
In pratica o passi alla funzione un puntatore di tipo stringa
void prova(LPCSTR a) {
  	strcpy(a,"ciao");
}
In questo caso devi essere sicuro (anzi deve esserlo chi invoca il 
metodo) di avere abbastanza spazio allocato per memorizzarvi tutti i 
byte della stringa (5 in questo caso). Ovvio che questo caso e' 
differente perche' non si hanno due puntatori alla stessa stringa ma 
si copiano fisicamente i caratteri da una stringa ("ciao") all'altra (a).
Se invece volevi proprio due puntatori alla stessa area di memoria 
allora rendi un puntatore ad una stringa che non puo' essere 
distrutta, ad esempio una variabile statica di una classe o qualsiasi 
altra cosa che non venga (potenzialmente) distrutta all'uscita del 
blocco della funzione.
Ciao

 Cosi' ti dico come fare... purtroppo a memoria non mi ricordo +....
Purtroppo non ho ancora trovato l'esempio che cercavo...
cmq guarda questo articolo, spiega molte cose sul passaggio VC++/VB.
http://www.visual-basic.it/uploads/articoli/tecnici/agVB_VC.htm
In caso non risolvi stasera faccio una prova e te la mando...
Cmq se ricordo bene devi usare il tipo BSTR e copia la stringa di uscita con
strcpy.
Ciao.
SkunkGuru.


Ci sono riuscito!
Grazie per gli aiuti, a te e a tutti gli altri.....
se vi interessa ci sono riuscito cosi:
LPSTR prova ()
{
	LPSTR ris;
	strcpy(ris,"ciao");
	return ris;
}
l'unica e' che la stringa e' un po' sporca quando torna al basic, ma la pulisco io ;)
Con il tipo BSTR la questione e' un po' piu' lunga e per quello che mi serve abbastanza inutile.
Ringrazio tutti ancora
Ciao 
Riccardo

 Con il tipo BSTR la questione e' un po' piu' lunga e per quello che mi
serve abbastanza inutile.
Cioe' ?
Ciao.
SkunkGuru.

 
Dunque:
sporca nel senso che torna indietro: "ciao                                             "
con un sacco di spazi, ma questo dipende dalla dimensione del buffer che comunque non e' necessario specificare.
Con il tipo BSTR e' piu' lunga perche devo allocare la stringa e dargli la dimensione a priori.
Siccome non so quanto sara' grande questa stringa preferisco il tipo LPSTR che non necessita' di "inizializzazioni".
Ciao
Riccardo