Per quanto riguarda GetProcAddress

Ho MyDll.dll e la sua funzione definita come di seguito

void pascal Myfunction(BOOL); 

quando sto cercando di utilizzare la funzione in un altro progetto non riesco a ottenere l’indirizzo della funzione con GetProcAddress() . Ecco il mio codice:

 void callMyDll() { HINSTANCE hDll; hDll=LoadLibrary(_T("MyDll.dll"); if(hDll!=NULL) { cout<<"\n DLL Loaded \n"; } else cout<<"\n DLL Not loaded\n" typedef void (__stdcall *MyFunction)(bool) Myfunction mf1 = (MyFunction) GetProcAddress(hDll, "MyFunction"); if (mf1!=NULL) cout<<"\n Function Loaded Successfully \n"; else cout<<"\n Function not loaded \n"; FreeLibrary(hDll); } 

Sto ricevendo come:

 DLL Loaded Function not loaded 

Ma quando sto provando con DLL conosciute come glut32.dll e le sue funzioni sta funzionando bene.

Penso che potrebbe essere un problema con la sua funzione come

     void pascal MyFunction(BOOL); 

    Qualcuno può aiutarmi in questo senso?

    È necessario utilizzare la extern "C" per impedire la manipolazione del nome e assicurarsi che la funzione venga esportata:

     extern "C" __declspec(dllexport) void Myfunction(BOOL); 

    Per visualizzare le esportazioni dalla tua DLL è ansible utilizzare dumpbin.exe utilità dumpbin.exe fornita con Visual Studio:

     dumpbin.exe /EXPORTS MyDll.dll 

    Questo elencherà i nomi di tutti i simboli esportati.

    Oltre a ciò non è specificato uno dei seguenti parametri del compilatore:

     Gz __stdcall calling convention: "Myfunction" would be exported as [email protected] Gr __fastcall caling convention: "Myfunction" would be exported as @[email protected] 

    Nota: penso che l’ultimo simbolo dipenda dalla versione del compilatore ma non è ancora solo “Myfunction”.

    Il processo di esportazione della DLL è sobject al nome di mangling e decorazione. La lunga convenzione di chiamata pascal a 16 bit obsoleta equivale a stdcall su piattaforms a 32 bit.

    Prima di tutto dovresti usare la extern "C" per specificare il collegamento C e disabilitare il manomissione del nome.

    Tuttavia, la tua funzione sarà comunque soggetta alla decorazione del nome . Se lo si esporta con __declspec(dllexport) , verrà esportato con il nome [email protected] . Se si desidera esportarlo con il suo vero nome, è necessario utilizzare un file .def.

    Tuttavia, rimane comunque la possibilità che non è stata esportata la funzione dalla DLL. Utilizzare Dependency Walker per verificare se è stato esportato e in tal caso con quale nome.

    Perché stai usando la convenzione di chiamata pascal ? Forse questo altera i nomi dei simboli, e in tal caso potrebbe essere necessario tenerne conto.

    Il simbolo verrà decorato, quindi non verrà mai chiamato MyFunction , più probabilmente [email protected] . puoi controllare rapidamente usando qualcosa come dumpbin .

    Puoi leggere ulteriori informazioni sul mangling qui , se vuoi evitare di cambiare il nome, devi usare un file def per specificare i nomi dei simboli (o ordinali).