Newsgroup: it.comp.lang.c++
Titolo: Stringhe per Dll in C Per VB

salve a tutti,
ho scritto una dll in C per usarla con VB.
Fin qui tutto bene. Ora sto provando a far passare una stringa dalla
dll in C a Visual Basic.
in pratica una cosa del genere:
extern "C" _declspec (dllexport) char _stdcall StrOper(double pos)
{
//Legge una stringa da un device di circa x caratteri da una certa
//posizione pos e dovrebbe tornarmela in Vb.
//Detta strc la stringa
	return strc;
}
Ovviamente dovrei passare un array ma non so come fare.
Qualcuno ha qualche documentazione? 
Grazie

 Ovviamente dovrei passare un array ma non so come fare.
dichiarare che il valore di ritorno è un puntatore.
Mi raccomando, termina la stringa con un bel null (ossia un 
ASCII zero), se no le routine di conversione che l'O.S. usa nel 
passaggio dei parametri rischiano di non fungere.
Se passi una stringa DA VB alla DLL, dichiarala Byval As String, 
in modo che sia passata per valore (in realtà viene copiata come 
ASCIIZ e passato il puntatore ad un array temporaneo)
Se passi un array C al VB, consiglio di dichiararlo come as long 
(e ti sbatti un po' a copiare l'indirizzo o trasferire i dati 
tipo con memcpy o memmove, o una api di sistema). Temo che non 
puoi dichiarare un array di caratteri semplicemente string, a 
meno che non implementi un po' di supporto all'automazione OLE 
(che è il tipo di stringa nativa con cui VB lavora, esattamente 
è quella parte del protocollo OLE definito BSTR, cercalo in rete 
... e sta tanto all'occhio !)
ciao
Soviet_Mario


Forse ho dimenticato una cosa.....
Io devo passare da C a VB semplicemente una stringa di (circa 100)
caratteri.
Non son un programmatore c quindi il discorso di memcopy etc.... lo sto
verificando.
Ora ho provato una cosa del genere:
IN C
extern "C" _declspec (dllexport) char*  _stdcall StrOper(double pos)
{
  //legge stringa
  char* strLett;
  strLett=LeggiStr(pos);
  return strlett;
}
IN VB
Private Declare Function StrOper Lib "CLettDll.dll" (ByVal bc As
double) As string
Risultato crashato VB ripetutamente.....

ancora meglio ...
allora:
Cosi funziona:
extern "C" _declspec (dllexport) char * _stdcall StrOper(char *a)
{
	char *r;
	r=a;
                return r ;
}
In VB mi ritorna la stringa corretta....
Cosi non funziona:
extern "C" _declspec (dllexport) char * _stdcall StrOper(char *a)
{
	char *r;
	r="test";
                return r ;
} 
Crasha VB...
BHO??????????????????

DELLA SERIE MERAVIGLIE DELLA SCIENZA (per me...)
in questo caso passa a VB il valore corretto del test e scrive bene nel
file
extern "C" _declspec (dllexport) char * _stdcall StrOper(char *a)
{
	char *r;
	r="test";
                int len=strlen(r);
	FILE *fp;
	fp=fopen("Clienti.txt","a");
	fwrite(r,1,len,fp);
	fwrite("  ",1,len,fp);
	fwrite(a,1,len,fp);
	fclose(fp);
	return r;
}
In quest'altro caso CRASHA VB:
extern "C" _declspec (dllexport) char * _stdcall StrOper(char *a)
{
	char *r;
	r="test";
	return r;
}
Non riesco a capire la differenza...
Sarà legato a qualcosa che riguarda la posizione delle variabili in
memoria..
Ma perchè se scrivo nel file è ok se non scrivo crasha tutto? BHO...

 Qualcuno ha qualche documentazione? 
La documentazione di Visual Basic la fornisce la Microsoft.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

Vi invito a spostare questa discussione su un newsgroup specifico per
le tecnologie Microsoft. Qui siete fuori tema.
Ciao,
Nicola