Newsgroup: it.comp.lang.visual-basic
Titolo: VB chiama C++

Il C e il C++ sono sicuramente piů veloci del VB per cui ho creato alcune
funzioni in C e C++ e le ho inserite in una .DLL che chiamo dal mio
programma VB.
Se la funzione chiamata restituisce un parametro funziona tutto
perfettamente.
Se, invece, deve restituire piů valori 'per riferimento' cominciano i
problemi.
Da VB č indispensabile dichiarare  le variabili e allocare lo spazio
(dichiarare di quanti bytes sono  formate le variabili  per es.  40 bytes
inizializzati a blanks ).
Se la funzione chiamata riempie la variabile con 20 bytes, dal programma VB
visualizzo i miei 40 bytes con i primi 20 modificati dalla funzione, il 21
byte č
un carattere strano( 'null' terminatore delle stringhe C ) e poi i rimanenti
bytes
a blanks.
Qual'č il 'tappo' per le  stringhe in VB ???
Chi mi aiuta a risolvere il problema ?
 Grazie
              franco

               franco
Beh, se dici che la stringa restituita visualizza 20 caratteri piů uno "Strano"
(chr$(0)), significa che inizializzi la stringa da VB con
Dim variabile As String *numerocaratteri
e le riempi con dei blanks prima di inviarle alla routine. Altrimenti, la striga
proseguirebbe con dei null. Infatti, in quel modo viene inizializzata con dei
Chr$(0).
Quindi, se vuoi ottenere la stringa in vb, devi considerare come tappo il
chr$(0), cercandolo con Instr.
Risultato$ = Left$(Variabile$, InStr(Variabile$, (Chr$(0)) - 1))
Spero di aver capito bene la domanda
Ciao
Flavio Ronco
--
f.ronco@*NonMiServeNiente*
flashnet.it
http:\\
www.geocities.com
\Paris\3461\
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]

Qual'è il 'tappo' per le  stringhe in VB ???
Le stringe VB corrispondono al tipo OLE BSTR formato da un header
(contenente anche l'informazione sulla lunghezza) e dal contenuto.
In ogni caso, seguendo l'esempio di diverse API quali FormatMessage,
potresti chiamare la funzione con NULL ed in questo caso ti restituisce
l'ampiezza del buffer desiderata oppure con l'indirizzo del buffer ed il
numero massimo di caratteri del buffer ed allora ti restituisce il numero di
caratteri effettivamente scritti.
Mi spiego meglio: mettiamo che hai la funzione MyMessage che scrive un
determinato messaggio in base ad un codice. La definizione in C potrebbe
essere la seguente:
long MyMessage(long nCode, char* pBuffer, long nLen);
Mettiamo che dichiari questa funzione in VB (una volta esportata in una DLL)
cosi':
Declare Function MyMessage Lib "MyDLL.dll" (ByVal nCode&, ByVal pBuffer$,
ByVal nLen&) As Long
Allora potresti chiamarla in questo modo:
' Mettiamo che 42 sia il codice del messaggio desiderato
Dim nBufLen
nBufLen = MyMessage(42, vbNull, 0)
'A questo punto hai in nBufLen la grandezza occorrente alla funzione.
Quindi...
Dim sBuffer$
sBuffer = String(nBufLen + 1, Chr$(0))
nBufLen = MyMessage(42, sBuffer, Len(sBuffer))
sBuffer = Left$(sBuffer, nBufLen)
In questo modo hai un codice che funziona sempre e non ti devi preoccupare
di pre-allocare un buffer di dimensioni "giuste".
Ciao
Gian Michele Bertoni
homepage: 
http://space.tin.it/computer/gbertoni