Newsgroup: it.comp.programmare.win32
Titolo: funzioni e argomenti di un dll

Ciao,
ho un file dll e ho scoperto quali funzioni contiene, come posso scoprire 
quali parametri bisogna passare ad ogni funzione? 

 quali parametri bisogna passare ad ogni funzione?
ti serve l'header
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

se l'avessi non avrei neanche chiesto aiuto ti pare? 

 quali parametri bisogna passare ad ogni funzione?
Credo che tu chieda una cosa impossibile. Potrai sapere le dimensioni e il
numero dei parametri ma poi cosa ci fai se non sai il tipo e cosa sono?
L'unica è procurarsi l'header o il sorgente.

 scoprire quali parametri bisogna passare ad ogni funzione? 
Puoi provare a capirlo vedendo il disassemblato ma, soprattutto se si 
tratta di puntatori a strutture, handles etc. non è così semplice.
Avere un exe che la richiama (anche quello senza sorgenti) può essere 
utile, ma comunque si tratta di un lavoro di cui è difficile 
determinare la complessità e, soprattutto, il risultato finale.
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non è valido)

 se l'avessi non avrei neanche chiesto aiuto ti pare?
Normalmente non e' possibile conoscere i parametri che
prende una funzione esportata da una DLL.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 se l'avessi non avrei neanche chiesto aiuto ti pare?
ah ho capito, devi essere un esperto.


 numero dei parametri ma poi cosa ci fai se non sai il tipo e cosa sono?
la dimensione è quasi sempre la stessa: corrisponde alla dimensione di
allineamento dello stack (4 byte).
per quanto riguarda il numero, è un'informazione che puoi ottenere solo
disassemblando (solitamente devi guardare il numero accanto al RET finale
e dividerlo per 4), e solo se la convenzione di chiamata prevede il
cleanup da parte del chiamato (__stdcall).


 prende una funzione esportata da una DLL.
non se le funzioni sono implementate in C++ e senza extern "C": se i nomi
dei simboli sono decorati puoi fare il demangling.


 dei simboli sono decorati puoi fare il demangling.
Infatti ho detto normalmente...
Ma giusto per capire di cosa si parla...
?wxStringTokenize@@YA?AVwxArrayString@@ABVwxString@@0W4wxStringTokenizerMode@@@Z
Secondo te l'oscenita' di sopra (e non ti ho preso la peggiore)
cosa e', cosa prende come parametri e cosa restituisce.
Per semplificarti la vita posso dirti che la DLL e' stata compilata
con VC++ 6.0 (e non sempre questa informazione e' disponibile).
Una volta che ci sei riuscito, potresti anche dirmi come diavolo sono
fatti i parametri e come diavolo e' fatto quello che restituisce. :-)
C:\>iao Angelo
P.S. Io, senza ravanare nei sorgenti, non avrei saputo rispondere.

 fatti i parametri e come diavolo e' fatto quello che restituisce. :-)
mi pesa il... mouse, ad andare sulla documentazione delle wxWidgets :P


 mi pesa il... mouse, ad andare sulla documentazione delle wxWidgets :P
Perche' puoi permettertelo... Supponi che quelle roba non fosse di
wxWidget e quella roba non fosse documentata on line: come facevi
a scoprire ad es. che wxStringTokenizerMode assume valori tra -1 e 5
(se non ricordo male) e soprattutto cosa diavolo significa passare 3
come wxStringTokenizerMode...
C:\>iao Angelo

dei simboli sono decorati puoi fare il demangling.
Auguri.  Il meccanismo di "name mangling" è quasi sempre proprietario.
Inoltre, anche nel caso di funzioni non decorate, puoi conoscerne il
nome, ma non i parametri.

 Auguri.  Il meccanismo di "name mangling" è quasi sempre proprietario.
ma non inaccessibile. vedi ad esempio giustappunto il caso di Microsoft...


ma non inaccessibile. 
In molti casi inaccessibile.  Ti piace di più ?

 come wxStringTokenizerMode...
se l'header della DLL definiva struct e tipi proprietari non documentati e
tu stai cercando di utilizzarla vuol dire che hai perso in partenza. ma
non ho mica detto il contrario io.
oltrettutto anche così la vedo ardua perché non conosci il dominio dei
parametri e come la funzione gestisce eventuali casi particolari.


 In molti casi inaccessibile.  Ti piace di più ?
vede professore, per Lei l'informatica è probabilmente una questione di
gusti, dalla qual cosa si evince che lei non è un programmatore di
professione :P
detto questo, tocca vedere anche la rilevanza dei casi: un conto sono G++
e CL, e un conto è DigitalMars. nei primi due casi (i più rilevanti) il
meccanismo è accessibile in entrambi i versi.


meccanismo è accessibile in entrambi i versi.
Il meccanismo di decorazione dei nomi, come già detto, è un meccanismo
proprietario.  Ogni casa è libera di fare le proprie aggiunte,
detrazioni, modifiche, senza mandarti un'e-mail per avvisarti.

 detrazioni, modifiche, senza mandarti un'e-mail per avvisarti.
alla prossima versione del compilatore Microsoft io mi aspetto che
undname.exe continui a funzionare.


undname.exe continui a funzionare.
Peccato che non tutti usino il compilatore del signor "mrnt".

con un disassembler ho dato un occhio alla dll e sono riuscito a scoprire il
numero di parametri da passare ad ogni funzione...per quanto riguarda il
tipo me li segnala tutti come dword, come mai? e soprattutto cos'è questa
dword? so che in c++ esiste il tipo DWORD ma non so bene cos'è. qualcuno mi
saprebbe spiegare?
un'altra cosa, solo 2 funzioni su una sessantina restituiscono un valore
dword mentre per tutti gli altri non è specificato, restituiranno tutti un
valore void? o che altro caso ci potrebbe essere?
ho creato così la mia dll che logga tutte le chiamate del programma e
richiama la dll originale, ovviamente nel log leggo qualcosa di questo
genere:  funzioneN(0, 234523, 4459827)
non so di che cosa si tratti...ma credo ke con un po di prove sia possibile
riuscire ad usare la dll originale senza problemi. 

 genere:  funzioneN(0, 234523, 4459827)
quei due valori li hai scritti a caso? perché il secondo potrebbe essere
un puntatore valido passatogli dall'eseguibile.


Neuron PE disassembler.
i valori reali passati dal programma alla dll sono questi: FT_ListDevices(0, 
454788, 1073741825)
ma se non č un dword, di che altro tipo di parametri potrebbe trattarsi?
e un altra cosa...continuando ad utilizzare parametri dword potrei 
utilizzare questa dll in una mia applicazione?
la funzione sopracitata viene chiamata SEMPRE (cioč ad ogni esecuzione del 
programma che la usa) con questi 3 parametri. 

 parametri e come la funzione gestisce eventuali casi particolari.
Ma era questa la sitazione dell OP... O Sbaglio? :-)
C:\>iao Angelo
P.S. Come ti e' stato fatto notare, il mangling e' proprietario, quindi
l'indicazione che la DLL era stata compilata con VC++ 6, non era
completamente superflua. Se avessi compilato quella DLL con
OpenWatcom, dubito fortemente che saresti riuscito a tirar fuori
i parametri.

 FT_ListDevices
Ma hai provato a cercare su google? Che a volte le soluzioni semplici 
sono le migliori...


 i parametri.
ma avrei capito che non era Visual C++, ne' la 6 ne' altre. trattandosi di
Visual C++ al contrario ho capito che si trattava di Visual C++ :P


 programma che la usa) con questi 3 parametri.
e che ne sai che dopo un'ora di uptime o dopo seicentoquarantottomila e
trecentottantadue esecuzioni il chiamante non cambia idea e non decide di
passargliene degli altri?


 esecuzione del programma che la usa) con questi 3 parametri.
Magari questo c'entra qualcosa?
http://www.ftdichip.com/Support/Knowledgebase/index.html?ft_listdevices.htm
-- 
Costantino Grana 

 non so bene cos'č. qualcuno mi saprebbe spiegare?
E' un tipo di dati definito in WinDef.h:
typedef unsigned long DWORD;
-- 
Costantino Grana 

 
http://www.ftdichip.com/Support/Knowledgebase/index.html?ft_listdevices.htm
lo dicevo io che il terzo parametro erano flags :D
cavolo, per il secondo non avevo pensato che quel valore poteva puntare
allo stack...
