Newsgroup: it.comp.lang.visual-basic
Titolo: [API CALL] Dll scritta in c, come variare il valore di un parametro passato?

Salve a tutti, mi accingo a lasciare questo post perché ho diligentemente 
cercato su google e non ho trovato nulla in proposito.
Ho scritto una dll in C che esporta la seguente funzione:
GM_EXPORT_VAL Md5File(LPSTR szFileName, LPSTR szHash)
{
     szHash = MD5File(szFileName);
 }
In Vb ho cosě dichiarato:
Private Declare Sub Md5File Lib "project.dll" Alias "Md5File@8" (ByVal 
szFileName As String, ByRef szHash As String)
poi, nella routine di un pulsante ho messo il codice:
Private Sub Command1_Click()
  Dim lHash As String * 256
  Dim lRet As Long
    Md5File Text1.Text, lHash
    Text2.Text = lHash
End Sub
Il Valore di Text2.Text č sempre stringa vuota.
Riesco a modificarne il valore se all'interno della funzione C metto
GM_EXPORT_VAL Md5File(LPSTR szFileName, LPSTR* szHash)
{
     *szHash = MD5File(szFileName);
 }
Solo che mi ritorna un valore che sembra piů l'indirizzo di memoria della 
variabile che non il valore...
Se qualcuno ha qualche idea... 


E' parecchio che non gioco più con queste cose, ma credo che anche la
seconda stringa vada passata ByVal (lo so, sembra un controsenso).
Inoltre per evitare la decorazione dell'alias puoi compilare la dll con
#define VB_CALL extern "C" __declspec(dllexport)
VB_CALL int WINAPI MyFunc([params])
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 #define VB_CALL extern "C" __declspec(dllexport)
Grazie, per la dritta Zanna... in effetti il preprocessore fa comodo...
comunqueil mio problema permane :-( ...
Sia che provi byVal o byRef il valore della variabile non viene modificato 
successivamente alla chiamata alla DLL... mannaggia!
Ma deve esserci un modo.... infatti avevo preso spunto da questa api call:
Private Declare Function GetPrivateProfileSection Lib "kernel32" _
    Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, _
    ByVal lpReturnedString As String, ByVal nSize As Long, _
    ByVal lpFileName As String) As Long
Io continuo a chiedere aiuto... ci sarą qualcuno che s'č scontrato con il 
mio stesso scoglio a questo mondo! 

     ByVal lpFileName As String) As Long
Io di C non ne capisco un tubo, quindi chiedo:
1) in C la tua funzione fa quello che dovrebbe?
Mica che sia già sbagliata a monte.
2) controlla le dichiarazioni in C ad es. di GetPrivateProfileSection, le
stringhe sono dei LPTSTR... non so se questo è solo un alias o cosa.
Comunque la cosa strana è che di solito richiedono anche la lunghezza della
stringa su cui lavorare...
Ciao

Che io ricordi, a lavoro ho fatto delle prove e ricordo che per usare le 
stringhe VB in C ho dovuto dichiararle come char * in C e passarle come 
ByVal in VB.
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)

 ha scritto nel messaggio
news:l%oIe.46009$fm.29...@news4.tin.it...


Scusate, sarò capra ma su quel documento non mi pare ci fosse molto di 
utile... non he che qualcuno ha brandelli di codice da postare? 

 ha scritto nel messaggio
news:l%oIe.46009$fm.29...@news4.tin.it...


Ok ma io questa conversione la farei volentieri in C... 

 Solo che mi ritorna un valore che sembra più l'indirizzo di memoria della


Il fatto è che il valore della variabile può essere modificato ma...
Visual Basic si aspetta una stringa che per C è BSTR.
Quindi come parametro OUT devo passare un BSTR, lavorare in C con char* e 
convertirlo in BSTR prima dell'uscita della funzione.
La conversione da char* a BSTR però mi dà non pochi problemi (Undefined 
Reference ne Linker) che purtroppo non sono in grado di risolvere data la 
mia scarsa conoscenza di C.
Purtroppo in questo caso l'apporto di C è strettamente necessario... le 
operazioni di checksum sui file in vb sono troooppo lente e di acquistare 
componenti non se ne parla, visto che sto sviluppando un progetto GPL.
Mi sa che sto andando OT... 

Dopo un giorno di sporconamenti vari in varie lingue... ho risolto!
Cioè, funziona... ma non sono sicuro della bontà...
Visual Basic usa le stringhe in formato BSTR, per cui vagando per la rete ho 
scoperto che in dovevo fare:
IN C:
#define VB_CALL extern "C" __declspec(dllexport) __stdcall
 VB_CALL  long GetFileMd5(LPSTR szFileName,BSTR szHash) {
     LPTSTR tmpString;
     tmpString = MD5File(szFileName);
     memcpy(szHash,tmpString,strlen(tmpString));
     return 0;
  }
memcpy...
e in VB:
Private Declare Function GetFileMd5 Lib "C:\Documents and 
Settings\spugna\Desktop\mp3Diggerdll\mp3Digger.dll" _
     (ByVal szFileName As String, ByVal szHash As String) As Long
Function mp3Hash(ByVal mp3File As String) As String
  Dim lHash As String * 256
  Dim lRet As Long
    GetFileMd5 mp3File, lHash
    mp3Hash = lHash
End Function
Dichiarando lHash come stringa a lunghezza fissa si schianta tutto però :-(
Comunque ora le funzioni di hashing viaggiano seriamente.