Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-07-2009, 10:57   #1
andreapav
Member
 
Iscritto dal: Oct 2008
Messaggi: 70
[VB6] utilizzo dll - parametro void*

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++...

Codice:
extern int __stdcall s_RgCallbk(long p, void *pUserData);
Grazie mille, ciao!
andreapav è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2009, 12:38   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Questo articolo potrebbe aiutarti.

Posto anche questo estratto:
Quote:
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.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 13-07-2009 alle 13:06.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2009, 14:48   #3
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da andreapav Guarda i messaggi
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++...

Codice:
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...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 01:12   #4
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
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.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 16:20   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da fero86 Guarda i messaggi
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.
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...
Comunque con tutti i C++ che ci sono qui, non è che ci sia la fila per rispondere...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 17:05   #6
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
ma dove sono gli amanti del C++ quando servono? cmq a me quel "void*" puzza di puntatore a funzione.
Kralizek è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 17:13   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
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.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 18:55   #8
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
ah ok... quindi può intendersi come usare "object" come tipo di un parametro in java o .net?
Kralizek è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 19:37   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Kralizek Guarda i messaggi
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).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 20:42   #10
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
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...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 20:56   #11
00pipp01
Bannato
 
Iscritto dal: Jul 2009
Messaggi: 6
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..
00pipp01 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 21:05   #12
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Ah, perciò era pure scritto sbagliato.
Non sarebbe (long p, void *pUserData), ma (long p, void* pUserData).
No, non è sbagliato, sono equivalenti.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 21:12   #13
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
ragazzi, veramente non sapete cosa vuol dire in C/C++ "void*"?
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, la cui funzione di callback é documentata sotto il nome di EnumWindowsProc. il cookie in questo caso é il parametro LPARAM di EnumWindows.


Quote:
Originariamente inviato da 00pipp01 Guarda i messaggi
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!!
bannategli l'IP, porca miseria!
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 21:25   #14
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Comunque secondo me dovresti fare
Codice:
ByRef pUserData As Any
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2009, 21:47   #15
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da ||ElChE||88 Guarda i messaggi
Comunque secondo me dovresti fare
Codice:
ByRef pUserData As Any
Vero. Potrebbe andare...

Quote:
Originariamente inviato da fero86 Guarda i messaggi
ragazzi, veramente non sapete cosa vuol dire in C/C++ "void*"?
Mettiamola così : il mondo è pieno di cose che vorrei sapere e il void* del C++... Non è mai stato tra quelle.
Cmq vedo che c'è abbastanza confusione, chi dice questo, chi dice quello...

Ma soprattutto : dove sarà finito andreapav ?
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
BioWare conferma: il nuovo Mass Effect &...
5 robot aspirapolvere di fascia alta in ...
Xiaomi Redmi Note 14 5G a 179€ è ...
Veri affari con gli sconti de 15% Amazon...
Tutti gli iPhone 16 128GB a 699€, 16e a ...
Take-Two ammette: vendite di Borderlands...
Tutti i Macbook Air e Pro con chip M4 ch...
GeForce RTX 50 SUPER: non cancellate, ma...
Warner Bros. riporterà al cinema ...
Hai usato il 'Pezzotto'? Ora anche la Se...
TeraFab: Musk vuole costruire la fabbric...
Lo compri una volta, lo giochi dove vuoi...
Qiantinuum annuncia Helios, "il com...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v