Вот мой код DLL:
#include <Windows.h>
#include <iostream>
int sysLol(char *arg);
int sysLol(char *arg)
{
std::cout<<arg<<"\n";
return 1;
}
И вот мой код приложения:
#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;
}
Итак, мой LIB.dll успешно загружен с помощью LoadLibrary()
, еще GetProcAddress()
терпит неудачу с 127.
Кажется, это происходит потому, что он не находит имя моей функции, но я не понимаю, почему это не получится.
Помощь очень ценится! 🙂
~ P
Поскольку этот тег является C ++, вам нужно объявить C
название для функции:
extern "C" int sysLol(char *arg);
Вы можете увидеть фактическое имя, которое компилятор дал вашей функции C ++ Зависимость Уокер.
В случае успеха приведите функцию к указателю, возвращенному GetProcAddress, к фактическому типу функции:
typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");
То есть ERROR_PROC_NOT_FOUND
Это означает, что не существует экспортируемой функции с таким именем.
Больше сказать нечего. Возможно, вы ошиблись именем. Это может быть простое несоответствие регистра букв. Возможно, DLL была собрана неправильно и не экспортирует функцию. Возможно, DLL украшает или искажает имена. Конечно, из кода в вопросе нет никаких доказательств того, что вы пытались экспортировать функцию или даже подавлять декорирование / искажение.
Используйте такой инструмент, как dumpbin
или Dependency Walker для проверки имен экспортируемых функций. Это может пролить свет на проблему.
Вместо того, чтобы связывать во время выполнения с LoadLibrary
а также GetProcAddress
, гораздо удобнее связать во время загрузки. Для этого используйте библиотеку импорта .lib, сгенерированную при сборке DLL.
Стоит также отметить, что соглашения о вызовах не совпадают. У вас есть cdecl на стороне DLL и stdcall на стороне исполняемого файла. И не бросайте указатели на DWORD
, Это плохо заканчивается, когда вы компилируете для 64 бит.
Символы должны быть явно экспортированы из Windows DLL. Либо объявите вашу функцию как __declspec(dllexport)
или передайте файл DEF компоновщику, чтобы дать ему команду экспортировать вашу функцию. Увидеть это описание dllexport
,