Ciao a tutti,
sono un programmatore Java e mi trovi mio malgrado a dover velocissimamente fare una cosa in C.
Ora vi espongo il problema che ho trovato.
Per iniziare sto lavorando con Eclipse cpp, g++ e MinGW.
Praticamente il fornitore di un lettore di carte magnetiche mi ha inviato un pacchetto con le API la libreria e i driver per utilizzare il device. QUindi il file .h, la lib e la dll.
Ho creato il progetto su Eclipse e gli ho linkato la libreria in maniera implicita. Il Linker vede la libreria ma continua a dirmi "undefined reference to `IfdClose'" ifClose è la funzione che referenzio.
L'output del compilatore è questo:
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\TestCardReader.o ..\src\TestCardReader.cpp
..\src\TestCardReader.cpp: In function `int main()':
..\src\TestCardReader.cpp:26: warning: unsigned int format, DWORD arg (arg 3)
g++ -LC:\workspace-cpp\TestCardReader\lib -oTestCardReader.exe src\TestCardReader.o -lVenusDrv
src\TestCardReader.o: In function `main':
C:/workspace-cpp/TestCardReader/Debug/../src/TestCardReader.cpp:21: undefined reference to `IfdOpen'
C:/workspace-cpp/TestCardReader/Debug/../src/TestCardReader.cpp:31: undefined reference to `IfdClose'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 907 ms.
Non venendone a capo ho provato a referenziare dinamicamente la dll... la trova ma poi comunque non riesce a chiamare il metodo.. il codice con cui ho effettuato la prova è questo:
HINSTANCE lpsolve;
typedef HANDLE (*FNVENUSOPEN)(char*);
FNVENUSOPEN MyFunc1;
LPCSTR string;
string = "IfdOpen";
lpsolve = LoadLibrary("VenusDrv.dll");
if (lpsolve == NULL) {
printf("Unable to load lpsolve shared library\n");
return(FALSE);
}
printf(string);
MyFunc1 = (FNVENUSOPEN) GetProcAddress(lpsolve, string);
DWORD dwfunct = GetLastError();
if (!MyFunc1)
{
// handle the error
FreeLibrary(lpsolve);
printf("Unable to find function DLL\n"+dwfunct);
return 0;
} else {
hIfd = MyFunc1("COM1");
if (hIfd == NULL)
{
char szBuf[200];
DWORD dw = GetLastError();
sprintf(szBuf, "IfdOpen failed: GetLastError returned %u\n", dw);
MessageBox(NULL, szBuf, "ERROR", MB_OK | MB_ICONSTOP);
ExitProcess(dw);
}
}
return 0;
Nemmeno questo va..
viene stampato: printf("Unable to find function DLL\n"+dwfunct);
con errore string::compare...
Sono disperato.. qualcuno mi da qualche dritta?