Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema da neofita su libreria non linkata

    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:
    codice:
    **** 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:
    codice:
    	 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?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dovresti guardare se nel compilatore è previsto un qualche tool per ricavare il nome delle funzioni. A volte possono essere decorate con un _ davanti al nome.
    Nel tuo caso potrebbe essere _IfdOpen
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Ti ringrazio.. effettivame poi l'ho referenziata con _IdfOpen@4.. l'ho trovata decompilando un programma che la usava

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.