Newsgroup: it.comp.lang.visual-basic
Titolo: Problemi di stringa con una dll (Visual Basic 5)

Ciao
dunque il mio problema è un po' complicato ma non so fino a che punto
ho cominciato a scrivere una DLL in visual C 5, nulla di speciale uso
solo stringhe.
ecco il codice:
#include <stdio.h>
#include <windows.h> //da togliere in futuro
#include <malloc.h>
#include "verbi.h"
extern "C" __declspec (dllexport) long __stdcall Verbix (char *v1, char
*streamer, int *sogg, int *xi) {
 char *buf = " Work!!!"; //ok qui creo una stringa
 char *temp; //qui una vuota
 temp = streamer; //copio il contenuto di streamer su temp
 streamer = ""; //lo azzero
  MessageBox(NULL,temp,"Prog",MB_OK); //ok vedo streamer il valore
importato
  strcat(temp, buf); //ok
  MessageBox(NULL,temp,"Cell C",MB_OK); //ok temp + buf
  streamer = (char *)malloc(sizeof(temp)); //ok se no vb crasha
  strcpy(temp, streamer); //copio la stringa
  MessageBox(NULL,streamer,"Cell C",MB_OK); //ottengo a schermo 'temp'
ok
  *sogg += 1;
  //OK , sogg viene torna incrementato in vb,
  //ma streamer risulta 'ÍÍÍÍýýýý' o una stringa strana che non centra
nulla con temp
}
##############################################################################################
ecco come richiamo la dll in VB
Private Declare Function Verbix Lib
"C:\Programmi\devstudio\MyProjects\Cell Verbi\debug\verbi.dll" _
Alias "_Verbix@16" (ByVal v1 As String, ByVal streamer As String, sogg2
As Integer, xi2 As Integer) As Long
poi va be , inserisco rispettivamente due stringhe e due integer, no
prob.
Il mio problema è che la variabile che mi serve 'streamer', deve toranre
in vb modificata, torna si modificata ma illeggibile (ÍÍÍÍýýýý),ho fatto
tutti quei passaggi e gioxhi di stringhe per capire dov'è il problema.
Se in VB dichiaro
Dim Streamer as string * 255  è peggio!!!
Cosa posso fare? eppure sogg ritorna incrementato di uno,
qualcuno può aiutarmi? ho fatto parecchi test, e molte volte vb crasha
quando esco dall'applicazione. forse ho generato qualche buffer
overflow, ma ho usato malloc , apposta per rimediare a questo.
graize mille
ciao

 tutti quei passaggi e gioxhi di stringhe per capire dov'è il problema.
Ma come vuoi modificare la variabile ???
BAU!

ok
grazie ai tuoi consigli sono riuscito a sistemare parecchio coidce, ora la
variabile stremaer mi pare creata correttamente,
solo che quando torna al vb, il vb crasha.
non capisco forse sbaglio ancora ad allocare memoria..... come posso fare?
ti mando il codice che ho corretto?
grazie ciao

ti mando le mie correzzioni e il mio ultimo problema.
extern "C" __declspec (dllexport) void __stdcall Verbix (char *v1, char
streamer[256], int *sogg, int *xi) {
 char buf[256]; //dichiaro due stringhe | spero che così sia giusto
 char temp[256];
 int i = 0;
 //temp = streamer;
 strcpy(temp, streamer); //copio streamer su temp
 strcpy(buf, " Work!!!"); //copio una serie di caratteri su buf
  // qui azzero stteamer per sicurezza, è un esempio di programmazione
non farci caso :)
    while(*(streamer+i) != 0) {
        *(streamer) = NULL;
        ++i;
    }
  strcat(temp, buf); //ok
  //streamer = (char *)malloc(sizeof(temp)); //se lo faccio ottengo un
casino ed è giusto streamer è già a 255
  strcat(streamer, temp);
  MessageBox(NULL, streamer,"Cell C",MB_OK); //ottengo a schermo 'temp'
ok perfetto
  *sogg += 1;
  return;
}
ora l'unico mio problema è che streamer è invariato, come entra esce
uguale e non con "work...."
dunque, non penso che ci siano più problemi nel mio codice,
ma stranmente quando esco dalla mia aplicazione VB crasha nella
kernel32.dll .
Non saprei dove può essere il problema, tu puoi dirmi se ho fatto le
cose correttamente ?
Ciao
FRSoldier

 cose correttamente ?
Ti consiglierei di usare un puntatore per la variabile streamer, come nella
prima versione e di controllare come dichiari e come chiami la funzione da
vb.
La metto giu` cosi`, quindi potrebbero esserci errori, ma prova con qualcosa
di simile. Se non vuoi usare la variabile globale gsBuffer, dichiarala
static nella funzione.
char gsBuffer[1024];
extern "C" __declspec (dllexport) void __stdcall Verbix (char *v1, char
*streamer, int *sogg, int *xi)
{
    char *buf = "Work";
    strcpy(gsBuffer, streamer);
    strcat(gsBuffer, buf);
    streamer=gsBuffer;
    MessageBox(NULL, streamer,"Cell C",MB_OK);
    *sogg += 1;
return;
}
BAU!