View Full Version : [VB6] utilizzo dll - parametro void*
andreapav
13-07-2009, 10:57
Ciao a tutti,
nel mio progetto in VB6 devo usare una libreria per la quale ho l'header per C++.
In una funzione ho come parametro void* Param, come converto questa cosa in VB6??
Vi posto la funzione dall'header C++...
extern int __stdcall s_RgCallbk(long p, void *pUserData);
Grazie mille, ciao!
banryu79
13-07-2009, 12:38
Questo articolo (http://www.visual-basic.it/articoli/agVB_VC.htm) potrebbe aiutarti.
Posto anche questo estratto:
Le conversioni comuni a tipi di dati di Visual Basic sono elencate di seguito:
* parametri numerici 8 a 16 bit: passaggio di parametri numerici 8 a 16 bit (int, short, unsigned int, BOOL, breve senza segno e WORD) come valore integer.
* parametri numerici a 32 bit: passare a 32 bit parametri numerici (unsigned long, long e DWORD) come LONG.
* Oggetto handle: tutti I punti di manipolazione sono valori integer a 32 bit univoco associati a una finestra e vengono passati per valore, quindi passare questi parametri come valore Long.
* Stringhe: stringhe di includere i LPSTR e LPBYTE dati tipi (puntatore ai caratteri) o un puntatore ai caratteri senza segno. Poiché Visual Basic passa un puntatore all'inizio della stringa, passare questi parametri come (ByVal param As String).
* I puntatori a valori numerici: passaggio di puntatori a valori numerici non con la parola chiave per la ByVal.
* Strutture: se il tipo di definita dall'utente di Visual Basic corrisponde la struttura previsto dalla DLL, la struttura può essere passata per riferimento. Nota: strutture non possono essere passati per valore.
* I puntatori a matrici: passare il primo elemento della matrice per riferimento.
* Null puntatori: se una DLL è previsto un puntatore null, passarlo come (ByVal paramname As Any) o paramname ByVal come valore Long. È possibile utilizzare 0 e il valore di paramname quando si chiama la DLL.
Ciao a tutti,
nel mio progetto in VB6 devo usare una libreria per la quale ho l'header per C++.
In una funzione ho come parametro void* Param, come converto questa cosa in VB6??
Vi posto la funzione dall'header C++...
extern int __stdcall s_RgCallbk(long p, void *pUserData);
Grazie mille, ciao!
Se hai già del codice C++ funzionante, e presumo tu conosca il C++ ( io non ne sono un gran conoscitore ), potresti spiegare che significa "void *pUserData" in quel contesto.
Sicuramente long p in VB6 sarà un "ByVal p As Long". Da quel che so long in C++ è un signed int a 32 bit, esattamente come in VB6...
Se hai già del codice C++ funzionante, e presumo tu conosca il C++ ( io non ne sono un gran conoscitore ), potresti spiegare che significa "void *pUserData" in quel contesto. probabilmente un cookie che qualche API passa alla funzione di callback di cui andreapav ha specificato il prototipo; é una tecnica che si usa sempre quando si un pattern a callback.
probabilmente un cookie che qualche API passa alla funzione di callback di cui andreapav ha specificato il prototipo; é una tecnica che si usa sempre quando si un pattern a callback.
Booh, ne so quanto prima. :D
A me basta solo sapere (long p, void *pUserData).
void *pUserData che è ? Gli passo un parametro che si chiama *pUserData ( e poi quello star iniziale che crea ancor + confusione... ) ed è di "tipo void" ???
Vediamo cosa dice andreapav... :mbe:
Comunque con tutti i C++ che ci sono qui, non è che ci sia la fila per rispondere... :D
Kralizek
14-07-2009, 17:05
ma dove sono gli amanti del C++ quando servono? cmq a me quel "void*" puzza di puntatore a funzione.
banryu79
14-07-2009, 17:13
Un void* è un puntatore di tipo void, cioè un particolare tipo di puntatore che può puntare a qualsiasi tipo di dato.
Il carattere di 'star' fa parte della dichiarazione di tipo, serve per dire che il tipo dichiarato "non è un tipo valore" ma un "tipo puntatore".
Della serie: dire int significa dichiarare un intero e dire invece int* significa dichiarare un puntatore a tipo intero.
Quindi void* è un puntatore a tipo void, cioè a qualsiasi tipo.
Molto utile per passare un tipo user defined, senza conoscerne l'esatto tipo in precedenza (scusa il gioco di parole).
Probabilmente, se nel suo contesto serve solo per passare una struttura/classe user defined magari per tradurre il tutto in VB6 lui potrebbe:
1) tradurre lato VB6 la sua struttura/classe che vuole passare alla funzione;
2) tradurre il parametro formale di tipo void* con un ByRef del tipo che si è definito al punto 1.
Disclaimer: non so se ho detto vaccate, questo è solo un ragionamento, in attesa di chiarificazioni da chi ha avuto esperienza in merito.
Kralizek
14-07-2009, 18:55
ah ok... quindi può intendersi come usare "object" come tipo di un parametro in java o .net?
banryu79
14-07-2009, 19:37
ah ok... quindi può intendersi come usare "object" come tipo di un parametro in java o .net?
Non proprio, dato che comunque la classe Object di Java:
a) non è un tipo primitivo (mentre void* sì);
b) porta con se informazioni sul tipo, mentre void vuol dire proprio non avere nessuno straccio di informazione sul tipo, e un puntatore a void può letteralmente puntare a qualsiasi tipo di dato. "Dall'altra parte", per così dire, sei tu programmatore che sai che tipo di dato ti arriva e puoi fare i tuoi bei cast.
Void pointer ti consente "solo" di passare potenzialmente qualsiasi dato.
Questo per quel poco che ne so (i miei ricordi del C/C++ sono quasi del tutto sfumati ormai).
Un void* è un puntatore di tipo void, cioè un particolare tipo di puntatore che può puntare a qualsiasi tipo di dato.
Il carattere di 'star' fa parte della dichiarazione di tipo, serve per dire che il tipo dichiarato "non è un tipo valore" ma un "tipo puntatore".
Della serie: dire int significa dichiarare un intero e dire invece int* significa dichiarare un puntatore a tipo intero.
Quindi void* è un puntatore a tipo void, cioè a qualsiasi tipo.
Molto utile per passare un tipo user defined, senza conoscerne l'esatto tipo in precedenza (scusa il gioco di parole).
Ah, perciò era pure scritto sbagliato.
Non sarebbe (long p, void *pUserData), ma (long p, void* pUserData).
Stando a quanto dici le due possibili traduzioni in VB6 potrebbero essere :
(ByVal p As Long, ByRef pUserData As Variant)
oppure
(ByVal p As Long, ByRef pUserData As Object)
Non saprei tradurlo in altro modo...
00pipp01
14-07-2009, 20:56
Io proverei prima a tradurre il tutto in un array cubico e poi lo "spalmerei" nell'intero codice tramite il metodo TransLate, che ha anche il vantaggio di produrre un file di log ottimizzato..
||ElChE||88
14-07-2009, 21:05
Ah, perciò era pure scritto sbagliato.
Non sarebbe (long p, void *pUserData), ma (long p, void* pUserData).
No, non è sbagliato, sono equivalenti.
ragazzi, veramente non sapete cosa vuol dire in C/C++ "void*"? :D
pare che solo banryu lo sappia.
pUserData a me sembra chiaramente un cookie, non un puntatore a funzione; il meccanismo é il seguente: lo "user code" chiama una qualche funzione API di un qualche framework, la funzione API chiamata vuole come parametro un puntatore a una funzione di callback che dovrá essere chiamata una o piu volte dalla funzione API stessa; il programmatore, scrivendo il codice della funzione di callback, trova utile avere delle "user information" che gli permettano dal codice di callback di capire in quale contesto é stata chiamata la funzione API, e queste "user information" sono puntate dal parametro pUserData che la funzione API riceve e passa cosi com'é direttamente alla funzione di callback tutte le volte (ignorandone completamente il significato).
un esempio: la funzione API Win32 EnumWindows (http://msdn.microsoft.com/en-us/library/ms633497(VS.85).aspx), la cui funzione di callback é documentata sotto il nome di EnumWindowsProc (http://msdn.microsoft.com/en-us/library/ms633498(VS.85).aspx). il cookie in questo caso é il parametro LPARAM di EnumWindows.
Io proverei prima a tradurre il tutto in un array cubico e poi lo "spalmerei" nell'intero codice tramite il metodo TransLate, che ha anche il vantaggio di produrre un file di log ottimizzato.. Gesu, basta, questo fake ha rotto le palle!! :asd:
bannategli l'IP, porca miseria! :asd:
||ElChE||88
14-07-2009, 21:25
Comunque secondo me dovresti fare
ByRef pUserData As Any
Comunque secondo me dovresti fare
ByRef pUserData As Any
Vero. Potrebbe andare...
ragazzi, veramente non sapete cosa vuol dire in C/C++ "void*"? :D
Mettiamola così : il mondo è pieno di cose che vorrei sapere e il void* del C++... Non è mai stato tra quelle. :p
Cmq vedo che c'è abbastanza confusione, chi dice questo, chi dice quello...
Ma soprattutto : dove sarà finito andreapav ? :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.