Newsgroup: it.comp.lang.visual-basic
Titolo: passare stringhe tra VB e VC++

Essendo il mio primo post, colgo l'occasione per salutare tutti e farvi i
miei complimenti per il sito comune.
passando alla mia domanda vorrei chiedervi come fare per passare una stringa
a una dll da fare in VC++ in cui devo fare un Replace(anzi + di uno) e poi
ottenere il risultato sulla stessa o anche su un'altra stringa.
Ho una scarsa conoscenza di VC++ e incontro grossi problemi con la gestione
delle stringhe( in pratica so solo passare una BSTR e convertirla in una
CString, ma nel fare la conversione inversa ottengo solo il primo carattere
perchè da quello che ho capito la BSTR è solo un puntatore a una stringa).
La mia funzione in VC++ dovrebbe ricevere quindi una stringa (BSTR) da VB,
convertirla in CString, fare i Replace tramite il metodo della CString e
ritornarmi una BSTR (o qualsiasi altra cosa che VB può leggere come
stringa).
Vi ringrazio anticipatamente
Roberto Alicata

 stringa).
con le dll di solito si usa un semplicissimo char * in quanto vb fa la
conversione automaticamente...
Se però devi cambiare la dimensione della stringa (ingrandire il buffer e
non tanto diminuirlo) il discorso si fa più complesso, perciò ti consiglio
prima di capire il funzionamento del passaggio dei parametri.Magari se devi
fare un replace passa una seconda stringa gia dimensionata a dovere(non
serve la dimensione giusta ma che sia più grande) :))
Se proprio vuoi gestire la BSTR devi passare il suo puntatore che se non
erro puoi ottenerlo con varptr(stringa) e poi con una dichiarazione del
genere.
Declare sub replace Lib "tuadll" (byval strDestinazione as long, _
                byval strOrigine as long,str1 as string,str2 as string)
passare i parametri in questo modo
replace  varptr(strO),varptr(strD),"a","aa"
le prime 2 le gestirai come BSTR invece le ultime come char *
extern "C" __declspec(dllexport)
   void  __stdcall replace ( BSTR *strDestinazione,BSTR *strOrigine,char
*str1,char *str2){
...
...
}
(puoi anche usare solo la destinazione come BSTR vedi tu) :))
non ho provato nulla però mi sembra il punto di partenza giusto..
(al limite se proprio non riesci chiedi pure )
ciao :)

Ho provato qualcosa del genere e ho risolto ( diciamo pure con tentativi a
caso :)) ) facendo cosě:
in VC++
void __stdcall converti(BSTR *miaStringa)
{
 CString cStr = *miaStringa;
 cStr.Replace("a","_mettidentroquestastringa_");
*miaStringa = cStr.AllocSysString();
}
e in VB
Private Declare Sub converti Lib "pluto.dll" (ByVal miaStringa As Long)
Dim pippo As String
pippo = "prova"
converti VarPtr(pippo)
MsgBox pippo
e infatti mi ritorna pippo = "prov_mettidentroquestastringa_"
Non so bene perchč.. ma funziona :)
mi č stato di ENORME aiuto il tuo consiglio per usare VarPtr che non č
neanche documentato dentro MSDN...
grazie mille!!! grazie grazie grazie !
Saluti
Roberto Alicata

 Non so bene perchè.. ma funziona :)
perchè passi il puntatore alla stringa (che è una bstr) e in questo modo
puoi modificarla come ti pare..
passando come parametro string invece viene passato solo il puntatore al
buffer convertito in semplice vettore di char (in quanto le bstr usano
vettori di widechar 2 byte) perciò privo del descrittore della stringa...
Puoi ottenere da vb il puntatore al buffer dei caratteri tramite
strptr(stringa) che sarà però un vettore di widechar(come gia detto 2 byte
per carattere).
ciao