Newsgroup: it.comp.lang.visual-basic
Titolo: Chiamare una DLL scritta in C

Salve,
scusate, mi rendo conto di chiedere una FAQ: ho scritto una DLL in C
(scritta da me) che dovrebbe essere chiamata da un programma in VB (che non
ho scritto io) , la DLL accetta in ingresso un puntatore a una serie di byte
terminanti con zero (in pratica una stringa in C -> char * ) . Il VB
dovrebbe passarmi un puntatore, credo che un array (riempito opportunamente
e terminato da 0) faccia al caso mio, visto poi che vorrei che fosse passato
per riferimento.
Ora, la Declare in VB come dovrebbe essere ?
In C, ho qualcosa di questo tipo:
int FunzioneC (char *testo)
{
}
Va bene una Declare fatta cosě ?
Declare Function FunzioneC Lib "miadll.dll" (ByRef buffer As Long) As Long
e poi puň essere chiamata cosě da VB ?
Dim buffer(10)
txt$="ciao"
buffer(0)=asc("c")
buffer(1)=asc("i")
buffer(2)=asc("a")
buffer(3)=asc("o")
buffer(4)=0
' chiaramente queste operazione saranno automatizzate !
res=FunzioneC( buffer() )
[...]
La sintassi č corretta ?? Grazie mille in anticipo !!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 }
Se ricordo bene dato che è un po' che non ci gioco potresti fare in uno dei
seguenti modi:
' ByVal: è già un puntatore, la chiamerai con
' Dim strBuffer as string
' strBuffer = "ciao"
' Call FunzioneC(StrPtr(strBuffer))
Declare Function FunzioneC Lib "miadll.dll" (ByVal buffer As Long) As Long
' Qui non ricordo se ByVal o ByRef, gli di passerà il primo byte dell'array:
' Call FunzioneC(buffer(0))
Declare Function FunzioneC Lib "miadll.dll" (ByVal buffer As byte) As Long
' ByVal anche se è una stringa, ci pensa VB a passare il puntatore
' Per sicurezza gli puoi passare una stringa null-terminated:
' buffer = "ciao" & vbNullChar
' Call FunzioneC(buffer)
Declare Function FunzioneC Lib "miadll.dll" (ByVal buffer As String) As Long
' Credo sia valida anche questa, d'altra parte VB tratta le
' stringhe come array di byte:
' Dim buffer() as byte
' buffer = StrConv("ciao" & vbNullChar, vbFromUnicode)
' Call FunzioneC(buffer)
' Anche qui ho il dubbio su ByVal o ByRef
Declare Function FunzioneC Lib "miadll.dll" (ByRef buffer() As byte) As Long
Secondo me la più facile da usare è quella As String
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Declare Function FunzioneC Lib "miadll.dll" (ByRef buffer As byte) As Long
Credo che questa dovrebbe funzionare. Domani controllerò. Mi interessa usare
il ByRef, così la modifica al buffer varrà anche da VB. Solo che nella
Declare il buffer non va identificato come array: -> buffer() , ma come
semplice variabile: -> buffer . Avevo letto che questo era un bug del VB.
Non sono sicuro però se debba essere :
- ByRef buffer As Byte
oppure:
- ByRef buffer as Long (in teoria passando un puntatore, questo dovrebbe
andar bene)
Le stringhe in VB dovrebbero essere VARIANT e ci sono diversi problemi a
passarle per riferimento (ByRef) , passandole come ByVal in effetti, si
dovrebbe ottenere il puntatore al I carattere, però la stringa in questo
caso è copiata. Il Buffer invece è un sistema pratico e veloce, almeno nel
passaggio dei dati alla DLL.
Grazie per l'aiuto.


 passaggio dei dati alla DLL.
Come preferisci.
