Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Xiaomi ha portato Redmi Watch 6 anche sul mercato italiano, puntando su un display AMOLED da 2,07 pollici con picco di luminosità a 2000 nit, frame in alluminio da 9,9mm e un'autonomia dichiarata di 12 giorni. Lo smartwatch gira su HyperOS 3 e integra GPS, Bluetooth 5.4 e oltre 150 sport mode. Il tutto a meno di 100 euro
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-01-2007, 13:42   #1
Fiat82
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
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 14:12   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
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
Allora ... innanzitutto, almeno per mia esperienza personale, non sempre coff2omf riesce a convertire correttamente la lib. Mi sono capitati dei casi in cui non era riuscito a fare il suo dovere ...

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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 14:30   #3
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Allora ... innanzitutto, almeno per mia esperienza personale, non sempre coff2omf riesce a convertire correttamente la lib. Mi sono capitati dei casi in cui non era riuscito a fare il suo dovere ...

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.
ciao, per prima cosa grazie di aver risposto.
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
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 14:40   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
Allora io vorrei usare il metodo con caricamento dinamico dei metodi(quindi LoadLibrary e GetProcAddress)
Ok

Quote:
Originariamente inviato da Fiat82
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.
Innanzitutto la funzione LoadLibrary ricerca la DLL usando una sequenza ben precisa, riporto qui di seguito la sequenza (dalla documentazione ufficiale):
Quote:
1) The directory from which the application loaded.
2) The current directory.
3) The system directory. Use the GetSystemDirectory function to get the path of this directory.
4) The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
Windows Me/98/95: This directory does not exist.

5) The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
6) The directories that are listed in the PATH environment variable.
Poi non saprei dirti di preciso cosa c'è che non va. Magari posta il codice, così vediamo se è corretto o meno.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 14:49   #5
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Ok

Innanzitutto la funzione LoadLibrary ricerca la DLL usando una sequenza ben precisa, riporto qui di seguito la sequenza (dalla documentazione ufficiale):
Poi non saprei dirti di preciso cosa c'è che non va. Magari posta il codice, così vediamo se è corretto o meno.
hinstLibNomi=LoadLibrary("c:\prova.dll");//in questo percorso c'è la dll
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?
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:08   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
hinstLibNomi=LoadLibrary("c:\prova.dll");//in questo percorso c'è la dll
Se proprio vuoi mettere un path assoluto, devi fare l'escape di \, quindi "c:\\prova.dll"

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:
Originariamente inviato da Fiat82
il mio dubbio è che se la dll nn fosse stata scritta in modo compatibile col borland come faccio a farla diventare?
Normalmente è ininfluente con quale tool/compilatore è stata fatta la DLL. A te basta sapere il nome esatto (eventualmente decorato) della funzione e il prototipo esatto, che comprende anche il modo di passaggio degli argomenti.

Quote:
Originariamente inviato da Fiat82
il file .lib a cosa serve al borland?
parlo del . lib che mi ho ottenuto con implib o con coff2omf?
È una "import library", una libreria che non contiene variabili o funzioni ma che serve solo per ottenere una dipendenza statica con una DLL.
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:15   #7
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Se proprio vuoi mettere un path assoluto, devi fare l'escape di \, quindi "c:\\prova.dll"

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.

Normalmente è ininfluente con quale tool/compilatore è stata fatta la DLL. A te basta sapere il nome esatto (eventualmente decorato) della funzione e il prototipo esatto, che comprende anche il modo di passaggio degli argomenti.

È una "import library", una libreria che non contiene variabili o funzioni ma che serve solo per ottenere una dipendenza statica con una DLL.
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.
si ho copiato male volevo scrivere hinstLibNomi=LoadLibrary("c:\\prova.dll");
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?
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:21   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
si ho copiato male volevo scrivere hinstLibNomi=LoadLibrary("c:\\prova.dll");
ma il problema rimane come mai hinstLibNomi è nullo?
Beh, non ne ho idea ... chiama GetLastError() e vedi che codice di errore indica.

Quote:
Originariamente inviato da Fiat82
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?
Esatto.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:25   #9
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Beh, non ne ho idea ... chiama GetLastError() e vedi che codice di errore indica.

Esatto.
mi dici cosa avrei dovuto fare se avessi usato i linker non dinamico ma statico?
grazie
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:38   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
mi dici cosa avrei dovuto fare se avessi usato i linker non dinamico ma statico?
grazie
Non devi più usare LoadLibrary/GetProcAddress (ovviamente) e poi devi semplicemente specificare al linker di fare il link con la import library.
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:48   #11
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Non devi più usare LoadLibrary/GetProcAddress (ovviamente) e poi devi semplicemente specificare al linker di fare il link con la import library.
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.
si ho anche un file.h che contiene le dichiarazioni extern ai metodi contenute nella dll.
devo controllare qc?
cq nn funziona nulla.nn riesco con entrambe le strade ad ottene qc
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:55   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
si ho anche un file.h che contiene le dichiarazioni extern ai metodi contenute nella dll.
devo controllare qc?
Perfetto, devi semplicemente fare un #include di questo file .h nel tuo sorgente.

Quote:
Originariamente inviato da Fiat82
cq nn funziona nulla.nn riesco con entrambe le strade ad ottene qc
Purtroppo non posso aiutarti più di tanto (la sfera di cristallo non ce l'ho ancora ) .... per quanto riguarda il caricamento a runtime, hai provato a vedere cosa restituisce GetLastError() ?? Potrebbe essere utile.
Per quanto riguarda l'utilizzo della import library, quale è il problema?? In fase di link? quando avvii il programma??
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 15:58   #13
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
Perfetto, devi semplicemente fare un #include di questo file .h nel tuo sorgente.

Purtroppo non posso aiutarti più di tanto (la sfera di cristallo non ce l'ho ancora ) .... per quanto riguarda il caricamento a runtime, hai provato a vedere cosa restituisce GetLastError() ?? Potrebbe essere utile.
Per quanto riguarda l'utilizzo della import library, quale è il problema?? In fase di link? quando avvii il programma??
il mio problema è in fase di esecuzione, l'oggetto che rappresenta la dll è null e perciò nn riesco a richiamare i metodi.
GetLastError che cosa è?
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 16:04   #14
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
GetLastError che cosa è?
È una funzione Win32 che restituisce il codice di errore dell'ultima funzione chiamata.
Codice:
if (hInstDLL == NULL)
{
    CHAR szMsg[32];
    wsprintf (szMsg, "Error %lu", GetLastError ());
    MessageBox (NULL, szMsg, "LoadLibrary Failed", MB_OK);
}
Così almeno sai che diavolo di errore è.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 16:13   #15
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da andbin
È una funzione Win32 che restituisce il codice di errore dell'ultima funzione chiamata.
Codice:
if (hInstDLL == NULL)
{
    CHAR szMsg[32];
    wsprintf (szMsg, "Error %lu", GetLastError ());
    MessageBox (NULL, szMsg, "LoadLibrary Failed", MB_OK);
}
Così almeno sai che diavolo di errore è.
ultima cortesia mi sai dire dove trovo il significato dell'errore?a me esce errore 126 e basta
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 16:16   #16
Fiat82
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 19
Quote:
Originariamente inviato da Fiat82
ultima cortesia mi sai dire dove trovo il significato dell'errore?a me esce errore 126 e basta
ho trovato
//
// MessageId: ERROR_MOD_NOT_FOUND
//
// MessageText:
//
// The specified module could not be found.
//
#define ERROR_MOD_NOT_FOUND 126L

in winerror.h
Fiat82 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 16:18   #17
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Fiat82
ultima cortesia mi sai dire dove trovo il significato dell'errore?a me esce errore 126 e basta
Gli errori li trovi nell'include WinError.h, che fa parte degli include del Platform SDK.

L'errore 126 è ERROR_MOD_NOT_FOUND (The specified module could not be found)
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 19:23   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Fiat82
ultima cortesia mi sai dire dove trovo il significato dell'errore?a me esce errore 126 e basta
si era già capito dal primo post
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.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 19:25   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
una precisazione
Quote:
Originariamente inviato da Fiat82
Allora io vorrei usare il metodo con caricamento dinamico dei metodi (quindi LoadLibrary e GetProcAddress)
quello si chiama esplicito, non dinamico. il caricamento di una DLL è sempre dinamico, altrimenti non si chiamerebbe Dynamic Linked Library

il linking statico invece è un'altra cosa.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 19:29   #20
71104
Bannato
 
L'Avatar di 71104
 
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).
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Formula V vi farà cambiare l'airf...
Netflix usa l'IA generativa per battere ...
Quando l'AI costruisce sé stessa:...
Meno ventole, più raffreddamento:...
Adidas Trionda: come funziona la tecnolo...
Withings BodyFit, la bilancia che va ben...
QNAP annuncia QuTS hero h6.0: il sistema...
ColorOS 17 con Android 17: la lista dei ...
DDR4, il ritorno che nessuno si aspettav...
Corsair vuole un singolo cavo per colleg...
Linux 7.2 si avvierà sui Mac M3, ...
Xiaomi 17T e 17T Pro a prezzi mai visti:...
Microsoft annuncia Majorana 2 e prevede ...
Windows 11: addio ai menu contestuali ca...
Maxi raid internazionale contro la pirat...
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: 17:24.


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