|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Urgenza linguaggio C e dll
Ciao a tutti ho questo problema.
Sto scrivendo,usando il borland 5.5, un programma in C che deve utilizzare dei metodi dichiarati all'interno di una dll. In mio possesso ho un file .dll e un file .lib di cui nn ne conosco l'origine ma sono sicuro che contengono i metodo che voglio usare nel mio progetto(mi sono creato il file. def della dll usando l'utility del borland impdef e ho verificato i metodi inseriti). il file .lib è stato convertito usando coff2omf in modo da renderlo compatibile al Borland. ho richiamato la dll all'interno del codice usando il comando LoadLibrary e passandoli come parametro il percorso dove trovare la dll. il file .lib convertito è stato inserito nel percorso delle librerie del progetto. Il problema è che l'oggetto di tipo HINSTANCE che dovrebbe permettere di accedere ai metodi contenuti nelle dll è sempre NULL come se nn vedesse la dll. che devo fare?Grazie ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque la questione è che se riesci, in qualche modo, ad ottenere una "import library", non hai poi bisogno di usare LoadLibrary, perché linkando con la import library, il tuo eseguibile avrà una dipendenza "statica" verso la DLL. Al contrario, se preferisci effettuare il caricamento della libreria a run-time con LoadLibrary (e GetProcAddress per ottenere l'indirizzo delle funzioni), non hai più bisogno della import library, ti basta solo sapere nome e prototipo della funzione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
Allora io vorrei usare il metodo con caricamento dinamico dei metodi(quindi LoadLibrary e GetProcAddress)il problema è che al momento di caricare la dll nn viene rilevata. intanto seguo il tuo consiglio e tolgo dal library path il percorso del file .lib. dimmi cosa devo fare per essere sicuro che la dll venga letta e perciò possa usare i metodi in essa contenuti. grazie mille |
|
![]() |
![]() |
![]() |
#4 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#5 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
poi passo a richiamare il metodi. Il problema è che la variabile hinstLibNomi mi rimane nulla invece di essere valorizzata. il mio dubbio è che se la dll nn fosse stata scritta in modo compatibile col borland come faccio a farla diventare? il file .lib a cosa serve al borland? parlo del . lib che mi ho ottenuto con implib o con coff2omf? |
|
![]() |
![]() |
![]() |
#6 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque sconsiglierei di mettere un path assoluto (se non ci sono necessità particolari, ovviamente). Basta usare solo il nome della DLL. Poi è sufficiente che la DLL stia in PATH o nella stessa directory dell'eseguibile. Quote:
Quote:
I file .lib possono anche ovviamente contenere variabili/funzioni, in quel caso non sono import library ma librerie statiche "normali". P.S. se vuoi vedere le funzioni esportate da un DLL, usa il tool Dependency Walker.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#7 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
ma il problema rimane come mai hinstLibNomi è nullo? allora il file .lib originale che era insieme alla dll e il file .lib che mi sn creato non servono a nulla se seguo la strada del link dinamico? |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#9 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
grazie |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Per chiamare le funzioni hai però bisogno di sapere comunque i prototipi delle funzioni (questo per il compilatore). Fino ad adesso hai parlato solo di un file .dll e un file .lib. In genere insieme a questi due, dovrebbe essere dato anche uno (o più) file di include (.h) che contiene le varie definizioni, prototipi, ecc... utili per usare la libreria.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#11 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
devo controllare qc? cq nn funziona nulla.nn riesco con entrambe le strade ad ottene qc |
|
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
![]() Per quanto riguarda l'utilizzo della import library, quale è il problema?? In fase di link? quando avvii il programma??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#13 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
GetLastError che cosa è? |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
if (hInstDLL == NULL) { CHAR szMsg[32]; wsprintf (szMsg, "Error %lu", GetLastError ()); MessageBox (NULL, szMsg, "LoadLibrary Failed", MB_OK); }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#15 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
|
|
![]() |
![]() |
![]() |
#16 | |
Junior Member
Iscritto dal: Jun 2006
Messaggi: 19
|
Quote:
// // MessageId: ERROR_MOD_NOT_FOUND // // MessageText: // // The specified module could not be found. // #define ERROR_MOD_NOT_FOUND 126L in winerror.h |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
L'errore 126 è ERROR_MOD_NOT_FOUND (The specified module could not be found)
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() anche se il modulo è già caricato implicitamente tramite import, LoadLibrary restituisce sempre l'handle (la differenza tra LoadLibrary e GetModuleHandle è che la prima incrementa anche il reference count). quindi se non te l'ha restituito vuol dire che non trovava il file. |
|
![]() |
![]() |
![]() |
#19 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
una precisazione
![]() Quote:
![]() il linking statico invece è un'altra cosa. |
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
altra cosa: Visual C++ in edizione Enterprise include un utilissimo tool che spero non abbiano rimosso nella versione 2005 (non l'ho ancora provata in edizione Enterprise) che si chiama Error Lookup (ERRLOOK.EXE) e restituisce, dato il numero di un errore di sistema ritornato da GetLastError(), la stringa descrittiva dell'errore (vedere API FormatMessage).
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:27.