C++ GetProcAddress()失败,错误127

C++ GetProcAddress()失败,错误127,c++,dll,loadlibrary,getprocaddress,C++,Dll,Loadlibrary,Getprocaddress,这是我的DLL代码: #include <Windows.h> #include <iostream> int sysLol(char *arg); int sysLol(char *arg) { std::cout<<arg<<"\n"; return 1; } #包括 #包括 int sysLol(字符*arg); int sysLol(字符*arg) { std::cout即ERROR\u PROC\u NOT\u FOUN

这是我的DLL代码:

#include <Windows.h>
#include <iostream>

int sysLol(char *arg);

int sysLol(char *arg)
{
   std::cout<<arg<<"\n";
   return 1;
}
#包括
#包括
int sysLol(字符*arg);
int sysLol(字符*arg)
{

std::cout即
ERROR\u PROC\u NOT\u FOUND
,这意味着不存在具有该名称的导出函数

没什么好说的了。也许你的名字搞错了。可能是字母大小写不匹配。也许DLL构建不正确,没有导出函数。也许DLL正在修饰或损坏名称。当然,从问题中的代码来看,没有证据表明你试图导出函数,或者确实抑制装饰/损坏

使用
dumpbin
或Dependency Walker之类的工具检查导出的函数的名称。这可能会对问题有所帮助

与在运行时使用
LoadLibrary
GetProcAddress
进行链接相比,在加载时进行链接要方便得多。请使用在构建DLL时生成的.lib导入库进行链接


<> P>也值得指出的是,调用约定不匹配。DLL端有CDCL,在可执行端上有STDCULL。不要将指针指向“代码> dWord <代码>。当编译64位时,结果很糟糕。

< P>因为该标签是C++,所以需要声明< <代码> C <代码>代码名:
extern "C" int sysLol(char *arg);

可以看到编译器赋予C++函数的实际名称。 成功后,将函数转换为GetProcAddress返回的指针,转换为实际的函数类型:

typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");

必须从Windows dll显式导出符号。请将函数声明为
\uu declspec(dllexport)
,或将DEF文件传递给链接器,以指示其导出函数。请参阅请使用Dependency Walker,它将提示在dll中注册的方法名称

如果方法名称为
-getNumber
Dependency Walker将实际的方法名称显示为-
\u Z9GetNumberd


现在
LoadLibrary
GetProcAddress()
两者都可以使用。

这是用于流程注入的,所以加载时间链接对我来说不是一个选项。调用约定不匹配,因为实际的源代码比我发布的源代码复杂得多,所以我必须仔细检查并快速将代码压缩到上面看到的内容中。很可能我快速键入了g错误。至于转换到DWORD,目前我的进程注入指向32位进程,并被编译为32位可执行文件,但我确实计划最终将其扩展到64位,因此感谢您的提示。:)很好。我根据我所看到的回答。我仍然认为我回答了您的问题。将您的函数放在外部“C”中块。使用declspec(dllexport)cdecl没有损坏。如果您需要不同的调用约定,请使用def文件进行导出。@TamásSzelei no。这会导致
错误\u MOD_NOT_FOUND
@Tamás也许我们可以整理这些注释。这似乎是一个开始,但显然我的函数名是修饰过的。我现在在谷歌上搜索,但当我在这里的时候,你知道解决方法吗这是在Visual Studio 2012环境中发生的?请给出您的答案,以改进格式并删除所有大写字母。Augen,请澄清为什么此答案无效,以及为什么您对我投了反对票?我之所以投了反对票,是因为糟糕的格式使它很难阅读,因此几乎没有任何用处。我看到它现在已被修复。尽管实际的用处是有限的仍然有争议,因为答案与公认的答案几乎相同,没有
extern“C”
替代方案。无论如何,现在取消否决票。
typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");
lpGetNumber = (LPGETNUMBER)GetProcAddress(hDLL, "_Z9GetNumberd");