Newsgroup: it.comp.lang.visual-basic
Titolo: [?] API che con Visual Delphi vanno e con VB6 no.

Per controllare un apparecchio collegato con la seriale uso delle funzioni
api che fanno rifermiento a una libreria.
Se chiamo la funzione Connect (1) dove 1 e' il numero della porta
in Visual Delphi restituisce 0 (cioč OK sei connesso)
in Visual Basic mi restituisce 1 (cioč non posso connettere)
ma siccome il programma a cui sto lavorando e' gia' tutto in VB mi chiedevo
perche' cavolo si comporta cosi'?
Il fatto e' che la funzione viene caricata ed eseguita correttamente da
entrambi ma chissa' perche' se la chiama VB il risultato e' diverso.
Aiuto!

 in Visual Basic mi restituisce 1 (cioč non posso connettere)
[per Visual Delphi intendi Delphi?  :)  ]
Dovresti darci qualche informazione in piů... per esempio la Declare che
hai usato, e come l'hai usata.
--
Faber

 wrote in message
a9f9et$2mkns$1...@ID-66268.news.dfncis.de...


Call PCTAPI_SetNotifyCardOutOfField(AddressOf PCTAPI_NotifyProcCardOut)
Stai passando _ByRef_ gli indirizzi delle tue funzioni, mentre dovresti
passarli _ByVal_
-- 
hth, hal

 wrote in message
a9hbnm$32f87$1...@ID-56381.news.dfncis.de...


 wrote in message
a9hbnm$32f87$1...@ID-56381.news.dfncis.de...


valida..."
Bisogna vedere cosa va a finire in "carddata".
Non conosco la libreria che usi, sicche' non so suggerire nulla di preciso.
-- 
ciao, hal

 perche' la funzione su uscita che non ha parametri non si blocca.
Hai sicuramente ancora qualche byval/byref sbagliato.
Queste cose succedono perchè VB punta (nel primo caso) a un'area di memoria
che non gli appartiene o tenta (nel secondo caso) di deallocare la memoria
rilasciando la var. (che tra l'altro ritiene essere locale) che sempre non
gli appartiene.
Come sono le dichiarazioni "originali"?
Ciao

 wrote in message
UG_u8.27358$vF6.8...@news2.tin.it...


 > Queste cose succedono perchč VB punta (nel primo caso) a un'area di


Si puo' risolvere?
Hai provato a passare un array di byte, da analizzare successivamente, e
vedere che succede?
Se non andasse, allora credo che ti toccherebbe scriverti una funzioncina
wrapper in c.
-- 
ciao, hal

 wrote in message
a9j852$3l8qp$1...@ID-56381.news.dfncis.de...


ma non si puņ passare un array per valore!
E chi ha detto che devi passarlo per valore ? ;-)
-- 
ciao, hal

 wrote in message
a9jbgi$3kp4k$1...@ID-56381.news.dfncis.de...


2. comunque l'indirizzo di un array e' di 4 byte e non di 13 come volevo.
Ehm, l' indirizzo sara' sempre e solo di 4 byte sui sistemi a 32 bit.
-- 
ciao, hal

 wrote in message
a9jcvp$3gvha$1...@ID-56381.news.dfncis.de...


ma alla funzione arrivano come parametro (dalla dll) 13 byte!!!
Quello che intendevo (ma non e' detto che funzioni) era modificare
la dichiarazione cosi':
Private Type arr_CardData
	Dummy (0 To 12) As Byte
End Type
Public Sub PCTAPI_NotifyProcCardIn(CardData as arr_CardData)
Quindi ricevi arr_CardData e lo analizzi per copiare i valori giusti
nella struttura PCTAPI_CardData.
Fammi sapere ;-)
-- 
ciao, hal

 wrote in message
a9je9t$3li9u$1...@ID-56381.news.dfncis.de...


passato nei primi 4 byte non e' un indirizzo di memoria ma un valore.
Qui comincio a non seguirti piu': di che valore si tratta?
Del puntatore a CardData?
Prova allora a modificare cosi':
Public Sub PCTAPI_NotifyProcCardIn(ByVal pCardData as Long)
Se passasse allora si potrebbe copiare il blocco di memoria puntato
da pCardData nella struttura.
-- 
ciao, hal

 wrote in message
a9jfma$3mj1m$1...@ID-56381.news.dfncis.de...


deve sapere quanti byte dello stack sono stati usati per poterli deallocare.
E qui, AFAIK ce l'hai in un piede :-(
Mi sa che ti serve una piccola dll che ti faccia da ponte fra vb e la PCTAPI.
La documentazione del produttore dice qualcosa al riguardo, 
fornisce dei sorgenti?
-- 
ciao, hal

 
 Per le Api in VB (e anche VB.Net) c'è uno strumento utile e
completamente gratutito che si chiama API-Guide, e si scarica dal
seguente sito:
http://www.allapi.net/
Lo strumento, oltre alle dichiarazioni e a informazioni sulle
funzioni, mostra
anche esempi di utilizzo funzionanti.
Provare per credere
Ciao, 
Cesare Imperiali
http://codeguru.com/cgi-bin/bbs/wt/wwwthreads.pl?action=list&Board=vb

 userflag=0,credit=3000
Seguiamo l'esempio di hal.
Dichiari un array di long (per word intendeva long in questo caso?)
Dim a(0 to 3) As Long
Dichiari la funzione con un parametro Delclare ...Funz(ByVal Arr As Long)
'mi sembra si funzioni con ByVal
Passi il puntatore al primo elemento dell'array
Call Funz(a(0))
Dovrebbe funzionare.
Ciao