这是我的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
发布于 2014-09-16 20:32:33
由于该标记是C++,因此需要为函数声明一个C名称:
extern "C" int sysLol(char *arg);您可以看到编译器为您的C++函数提供了依赖沃克的实际名称。
成功后,将函数转换为GetProcAddress返回的指向实际函数类型的指针:
typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");发布于 2014-09-16 20:09:14
这就是ERROR_PROC_NOT_FOUND,这意味着不存在具有该名称的导出函数。
没什么可说的了。也许你的名字弄错了。这可能是一个简单的字母错配的情况。可能DLL的构建不正确,并且没有导出函数。也许DLL正在修饰或损坏名称。当然,从问题中的代码来看,没有证据表明您试图导出函数,或者确实禁止装饰/损坏。
使用像dumpbin或Dependency这样的工具来检查导出的函数的名称。这可能会对这个问题有所启示。
与运行时使用LoadLibrary和GetProcAddress进行链接不同,在加载时链接要方便得多。使用生成DLL时生成的.lib导入库进行此操作。
还值得指出的是,调用约定不匹配。DLL端有cdecl,可执行端有stdcall。也不要将指针投到DWORD。当您编译64位时,结果会很糟糕。
发布于 2014-09-16 20:48:01
符号必须从Windows DLL显式导出。要么将您的函数声明为__declspec(dllexport),要么将一个declare传递给链接器,以指示它导出您的函数。请参阅。
https://stackoverflow.com/questions/25877507
复制相似问题