GetProcAddress() scheitern, Fehler 127
Hier ist mein DLL-code:
#include <Windows.h>
#include <iostream>
int sysLol(char *arg);
int sysLol(char *arg)
{
std::cout<<arg<<"\n";
return 1;
}
Und hier ist mein code für die Anwendung:
#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <stdlib.h>
typedef int (WINAPI* Lol)(char* argv);
struct PARAMETERS
{
DWORD Lol;
};
int main()
{
PARAMETERS testData;
HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem
if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"\n";
else std::cout<<"LOADLIBRARY: "<<e<<"\n";
testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127?
if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"\n";
else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"\n";
std::cin.ignore();
return 1;
}
So, meine LIB.dll wird erfolgreich geladen LoadLibrary()
noch GetProcAddress()
schlägt mit 127.
Dies scheint zu sein, weil es nicht die Feststellung meiner Funktion name, aber ich sehe nicht, warum das scheitern würden.
Hilfe wird sehr geschätzt! 🙂
~P
InformationsquelleAutor Moon | 2014-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit diesem tag C++, müssen Sie deklarieren Sie eine
C
Namen für die Funktion:Sehen Sie die aktuellen Namen, den der compiler hat Ihre C++ - Funktion mit Dependency Walker.
Wenn Sie Erfolg hat, der Besetzung der Funktion zurückgegebenen Zeiger von GetProcAddress, um die eigentliche Funktion Typ:
InformationsquelleAutor egur
Ist
ERROR_PROC_NOT_FOUND
was bedeutet, dass es keine exportierte Funktion mit diesem Namen.Gibt es nicht viel mehr zu sagen. Vielleicht hast du den Namen falsch. Es könnte sein, ein einfaches Missverhältnis von groß-und Kleinbuchstaben. Vielleicht ist die DLL gebaut worden ist, falsch ist und nicht exportieren die Funktion. Vielleicht ist die DLL oder Dekoration mangeln die Namen. Sicherlich aus dem code in der Frage, es gibt keine Beweise, dass Sie es versucht zu exportieren, die Funktion, oder gar unterdrücken Dekoration/mangeln.
Verwenden Sie ein tool wie
dumpbin
oder Dependency Walker prüfen Sie die Namen der Funktionen, die exportiert werden. Das kann etwas Licht auf das problem.Eher als Verknüpfung zur Laufzeit mit
LoadLibrary
undGetProcAddress
ist es viel bequemer, den link zur Ladezeit. Verwenden Sie die .lib import-Bibliothek generiert beim erstellen der DLL zu tun.Es ist auch darauf hinzuweisen, dass die Aufrufkonventionen nicht übereinstimmen. Sie haben cdecl auf die DLL Seite, und stdcall auf die ausführbare Seite. Und nicht gegossen Zeiger auf
DWORD
. Das endet schlecht, wenn Sie kompilieren für 64 bit.Das ist in Ordnung. Ich antwortete, von dem, was ich sehen konnte. Ich denke immer noch, ich habe Ihre Frage beantwortet.
Setzen Sie Ihre Funktion in einem extern "C" block. Verwenden __declspec(dllexport) und cdecl haben nicht mangeln. Wenn Sie brauchen, andere Aufrufkonvention verwenden einer def-Datei zu exportieren.
InformationsquelleAutor David Heffernan
Symbole müssen explizit exportiert aus Windows-DLLs. Entweder erklären Sie Ihre Funktion als
__declspec(dllexport)
oder übergeben Sie eine DEF-Datei für den linker anweisen, es zu exportieren Funktion. Sehen diese Beschreibung vondllexport
.InformationsquelleAutor Khouri Giordano
Bitte verwenden Sie Abhängigkeit Walker, und Sie geben Hinweis auf den Namen der Methode, die registriert ist innen dll.
http://www.dependencywalker.com/
Wenn der name der Methode ist
- getNumber
Dependency Walker zeigt die tatsächliche Methode, die Namen wie-
_Z9GetNumberd
Ex -
Nun
LoadLibrary
undGetProcAddress()
beide funktionieren.InformationsquelleAutor Bhushan Mahajan