Newsgroup: it.comp.lang.visual-basic
Titolo: Porting di stringhe da 16 a 32-bit, trovate una soluzione a questo!!

Ciao a tutti,
Ho un problema che mi porto avanti da oramai molto tempo e che non
sono riuscito ancora a risolvere.
Per questo motivo non ho ancora passato il programma a 32 bit,
attualmente e' a 16 bit.
SITUAZIONE INIZIALE:
Una funzione in VB che, chiamando una DLL in Delphi, gli passa un
array di stringhe da poter modificare.
A 16 bit funziona tutto correttamente, passando a 32 bit la situazione
si complica NOTEVOLMENTE, per la diversa gestione delle stringhe.
Infatti viene mostrato solo la prima stringa.
Di seguito riporto il codice in Visual Basic 4 e quello in Delphi:
N.B. Ricordo che posso usare solo VB4 a 32 (non VB5 o 6).
CHI RISOLVE QUESTO ENIGMA E' UN GENIO (SECONDO ME,SECONDO ME) !!
VB4:
Type tag_StrutStr
    MiaStr As String * 255
End Type
Declare Function FunzDLLStringhe Lib "miadll.dll" Alias "#1" (ByRef
mioarr As tag_StrutStr) As Long
sub MiaFunzVB()
    Dim ArrayStringhe(5) as tag_StrutStr
    dim Ind%
    'Dimensiono le stringhe 
    For Ind%=0 to 4
        ArrayStringhe(Ind%) = space$(255)
    Next    
    'Chiamo la funzione in Delphi
    call FunzDLLStringhe(ArrayStringhe(0))
 
    'Visualizzo le Stringhe
    msgBox ArrayStringhe(0)
    msgBox ArrayStringhe(1)
    msgBox ArrayStringhe(2)
    ....
end sub 
DELPHI:
type
    Tag_PaoStr = record
        MiaStr : string[255];
    end;
 
    A_PARAMETRI_STR = array[0..5] of Tag_PaoStr;
    PTR_PARAMETRI_STR = ^A_PARAMETRI_STR;
Function FunzDLLStringhe (mioarrStr: PTR_PARAMETRI_STR):longint;
export; stdcall;
implementation
procedure FunzDLLStringhe(mioarrStr:PTR_PARAMETRI_STR);
begin
 
    mioarrStr^[0].MiaStr := 'Prima Stringa';
    mioarrStr^[1].MiaStr := 'Seconda Stringa ';
    mioarrStr^[2].MiaStr := 'Terza Stringa ';
end;
Vi posso assicurare che ho fatto una MAREA di prove.
Ho persino fatto una funzioncina in assembler per andare amettere
l'indirizzo giusto!!!
Infatti sembra che cosi' viene solo passato la prima stringa!
Sembra facile ma non lo e'.
Confido in voi per una soluzione che mi faccia andare avanti.
Se lo risolvete vi pago da bere, come minimo. :-)))
Grazie mille.
Paolo

Ciao a tutti,

Mah, non ho voglia di provare :) però posso provare a darti dei consigli:
1) non usare #1 nella dichiarazione dell'api, ma il suo alias letterale,
please...
2) Anzichè usare DimArray Stringhe(5) as tag_StrutStr fai
    Dim ArrayStringhe()
    ReDim ArrayStringhe(5) as tag_StrutStr
    Vb usa in un modo strano gli array statici.
3) Lo stesso vale per le stringhe, sarebbe meglio che non usassi il "* 255"
ma lasciassi la stringa dinamica (se puoi)
4) Perchè la funz. Delphi non la dichiari come:
procedure FunzDLLStringhe(mioarrStr:array of Tag_PaoStr); ?
5) se ancora non risolvi niente io proverei anzichè usare le stringhe a
usare array di Byte da passare all'api, guarda StrConv() per poter passare
da stringa a array di bytes e viceversa.
Ciao

 
allora, secondo me le due strutture sono incompatibili.
in vb una variabile string*255 dovrebbe corrispondere a 255 bytes.
in Delphi, string[255], è un po' diverso: utilizza qualche byte per 
salvarsi qualche altra informazione. Per avere un tipo dato compatibile 
dovresti scrivere:
type 
  Tag_PaoStr = record
    MiaStr : array [0..254] of char; 		
end;
MiaStr a questo punto occupa senz'altro 255 bytes.
mi viene in mente che con la string, che dovrebbe essere null terminated, 
allocherà forse un byte in più per il carattere null (terminatore). 
Questo forse ti rende illeggibili le stringhe successive.
Fammi sapere i risultati, ciao!

Ciao a tutti,
Ho un problema che mi porto avanti da oramai molto tempo e che non
sono riuscito ancora a risolvere.
Per questo motivo non ho ancora passato il programma a 32 bit,
attualmente e' a 16 bit.
SITUAZIONE INIZIALE:
Una funzione in VB che, chiamando una DLL in Delphi, gli passa un
array di stringhe da poter modificare.
A 16 bit funziona tutto correttamente, passando a 32 bit la situazione
si complica NOTEVOLMENTE, per la diversa gestione delle stringhe.
Infatti viene mostrato solo la prima stringa.
Di seguito riporto il codice in Visual Basic 4 e quello in Delphi:
N.B. Ricordo che posso usare solo VB4 a 32 (non VB5 o 6).
CHI RISOLVE QUESTO ENIGMA E' UN GENIO (SECONDO ME,SECONDO ME) !!
VB4:
Type tag_StrutStr
    MiaStr As String * 255
End Type
Declare Function FunzDLLStringhe Lib "miadll.dll" Alias "#1" (ByRef
mioarr As tag_StrutStr) As Long
sub MiaFunzVB()
    Dim ArrayStringhe(5) as tag_StrutStr
    dim Ind%
    'Dimensiono le stringhe 
    For Ind%=0 to 4
        ArrayStringhe(Ind%) = space$(255)
    Next    
    'Chiamo la funzione in Delphi
    call FunzDLLStringhe(ArrayStringhe(0))
 
    'Visualizzo le Stringhe
    msgBox ArrayStringhe(0)
    msgBox ArrayStringhe(1)
    msgBox ArrayStringhe(2)
    ....
end sub 
DELPHI:
type
    Tag_PaoStr = record
        MiaStr : array[0..254] of char;
    end;
 
    A_PARAMETRI_STR = array[0..5] of Tag_PaoStr;
    PTR_PARAMETRI_STR = ^A_PARAMETRI_STR;
Function FunzDLLStringhe (mioarrStr: PTR_PARAMETRI_STR):longint;
export; stdcall;
implementation
procedure FunzDLLStringhe(mioarrStr:PTR_PARAMETRI_STR);
begin
 
    mioarrStr^[0].MiaStr := 'Prima Stringa';
    mioarrStr^[1].MiaStr := 'Seconda Stringa ';
    mioarrStr^[2].MiaStr := 'Terza Stringa ';
end;
Vi posso assicurare che ho fatto una MAREA di prove.


     
prova:
call FunzDLLStringhe ( byval varptr(arrayStringhe()) )
ciao

, 
jgvnn....@tiscalinet.xxx.it
 says...
mi correggo
 prova:
 
 call FunzDLLStringhe ( byval varptr(arrayStringhe(0)) )
 
 ciao