Newsgroup: it.comp.lang.visual-basic
Titolo: Utilizzo di una DLL

Salve, sto scrivendo un'applicazione VB che usa una DLL scritta in C.
La mia esigenza è chiamare una sua API definita nel seguente modo:
    char*  addLeaf (const char * parentNodeID, const char* name,const  void*
value, int size)
L'API prelava il parentNodeID e in base a questo parametro riempie due
strutture di memorie che vengono allocate dalla DLL stessa che conterranno
(NAME) una stringa null terminated e (VALUE) una sequenza di byte di
dimensione size.
Io nella dichiarazione della DLL ho messo:
Declare Function addLeaf Lib "tesi_dll.dll" (ByVal parentNodeIDAs String,
ByVal nameAs _
String, ByVal valueAs Variant, ByVal sizeAs Long) As String
Quando usa la funzione mi da "La memoria non poteva essere letta".
In che modo posso passare il parametro VALUE che è forse non devo trattare
come un variant (a dire la verità mi sono buttato non ne ho idea di come
trattarlo).
Spero che qualcuno mi possa fare un esempio di utilizzo in una situazione
del genere.
Ciao
Riccardo

Quando usa la funzione mi da "La memoria non poteva essere letta".
Prova (ma non garantisco nulla ;-)con:
Declare Function addLeaf Lib "tesi_dll.dll" ( _
	ByVal parentNodeID As String, _
	ByVal name As String, _
	ByVal value As Any, _
	ByVal size As Long _
	) As String
Facci sapere, ed evita di postare lo stesso quesito su piu' newsgroups
perche' e' piuttosto seccante ritrovarsi le stesse domande in giro ;-)
-- 
hth, hal

 perche' e' piuttosto seccante ritrovarsi le stesse domande in giro ;-)
In principio ho postato su it.comp.lang.visual-basic, ma poi mi hanno detto
che per le DLL devo postare su it.comp.programmare.win32 e quindi ho postato
anche lě, non era mia intenzione fare crosspost.
Ciao
Riccardo

(char**).
Ahi, non e' mica facile :-(
Temo che occorra fare un po' di "ginnastica" con l' API, non credo sia
possibile cavarsela modificando il tipo di dato in vb.
La strada piu' facile, se puoi modificare i sorgenti della dll,
sarebbe quella di modificare la firma della funzione (o, meglio,
scriverne un wrapper) affinche' accetti semplici puntatori a char:
char*  addLeaf (const char* parentNodeID, 
		const char* name,
		const char* value, 
		int size)
e convertire opportunamente all'interno del codice C.
In mancanza puoi provare ad allocare un blocco di memoria sullo heap e
passarne il puntatore alla funzione C.
In questo caso pero' potrebbe essere necessario modificare la Declare
in VB da Variant a Any o Long. 
Butto giu' un esempio alla bell'e meglio:
// vairiabili valorizzate in questo esempio
Dim valoreNodo 	As String
Dim p1 		As Long
Dim p2		As Long
Dim ritornoDLL	As String
Dim size	As Long
// variabili valorizzate da qualche parte
Dim parentNodeID	As String
Dim name	As String
valoreNodo = "qualcosa ;-)"
// alloco il blocco per la lunghezza del valore del nodo
// da verificare se basta o se occorre tenere conto di '\0' finale
p1 = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(valoreNodo))
// blocco la memoria e vi copio la stringa, quindi la sblocco
p2 = GlobalLock(p1)
p2 = lstrcpy(p2, valoreNodo)
GlobalUnlock(p1)
// chiamo la dll C
size = Len(valoreNodo)	// suppongo che sia la dimensione di value
ritornoDLL = addLeaf(parentNodeID, name, p2, size)
-- 
hth, hal