Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7 GetProcAddress不适用于除void以外的函数_Windows 7_Dllimport_Getprocaddress - Fatal编程技术网

Windows 7 GetProcAddress不适用于除void以外的函数

Windows 7 GetProcAddress不适用于除void以外的函数,windows-7,dllimport,getprocaddress,Windows 7,Dllimport,Getprocaddress,我对GetProcAddress有问题: 我编写了一个简单的DLL,其中只有一个函数: extern "C" LRESULT WINAPI Function(HWND Hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { Beep(1000, 1000); return CallNextHookEx(0, Message, wParam, lParam); }

我对GetProcAddress有问题: 我编写了一个简单的DLL,其中只有一个函数:

extern "C" LRESULT WINAPI Function(HWND Hwnd, UINT Message,
                                   WPARAM wParam, LPARAM lParam)
{
    Beep(1000, 1000);
    return CallNextHookEx(0, Message, wParam, lParam);
}
当我尝试获取函数的地址时,GetProcAddress失败,错误代码为127 ERROR\u PROC\u NOT\u。但是,如果我使用void作为函数类型,它将非常有效。我真的不明白它为什么会这样。如有任何建议,将不胜感激


顺便说一句:DependencyWalker显示函数名确实是函数,没有应用任何更改。

GetProcAddress只有两种故障模式:

您没有导出该函数 你的名字不对 除非使用.def文件重命名导出或创建64位DLL,否则此函数的导出名不是函数。会的_Function@16对于32位构建。@16后缀将与这样一个事实密切相关,即您很难使它适用于具有任何参数的函数


在Visual Studio命令提示符下,在DLL上运行Dumpbin.exe/exports以查看导出。删除同一目录中的.pdb文件(如果有)。

GetProcAddress只有两种故障模式:

您没有导出该函数 你的名字不对 除非使用.def文件重命名导出或创建64位DLL,否则此函数的导出名不是函数。会的_Function@16对于32位构建。@16后缀将与这样一个事实密切相关,即您很难使它适用于具有任何参数的函数


在Visual Studio命令提示符下,在DLL上运行Dumpbin.exe/exports以查看导出。删除同一目录中的.pdb文件(如果有)。

最好使用模块定义.def文件和导出函数的名称,而不是u declspecdllexport。管理它们要容易得多

还有这个

定义DllExport外部C_uudeclspec DllExport


导致导出的DLL函数名没有任何C++修饰项

,使用模块定义.DEF文件,导出函数的名称,而不是y.OpjExpDeldLut导出是好主意。管理它们要容易得多

还有这个

定义DllExport外部C_uudeclspec DllExport


导致导出的DLL函数名没有任何C++装饰< /p> Hm,尝试导入Function@16, _Function@32及_Function@64,但它不起作用。。。。我做了一点实验,现在它变得很奇怪。当我将函数类型从lparamwinapi更改为void时,GetProcAddress可以很好地用于所有函数名,即使是像abc这样的函数,尽管这些函数并不存在!如果我使用原始类型,尽管GetProcAddress不起作用!不使用WINAPI会有很大的不同,这会禁用_stdcall并停止@postfix。运行dumpbin.exe/exports对于查找真实姓名至关重要,不要跳过它。我将Code::Blocks与MinGW64一起使用,因此我无法;还有其他选择吗?刚刚用当前的DLL再次运行DependencyWalker,现在它显示出来了Function@16没有。我试着导入它,结果成功了。但我还有一个问题:为什么我的函数运行在16位?它没有@16是堆栈激活帧的大小。4个参数,每个参数为32位4字节,4 x 4=16.Hm,已尝试导入_Function@16, _Function@32及_Function@64,但它不起作用。。。。我做了一点实验,现在它变得很奇怪。当我将函数类型从lparamwinapi更改为void时,GetProcAddress可以很好地用于所有函数名,即使是像abc这样的函数,尽管这些函数并不存在!如果我使用原始类型,尽管GetProcAddress不起作用!不使用WINAPI会有很大的不同,这会禁用_stdcall并停止@postfix。运行dumpbin.exe/exports对于查找真实姓名至关重要,不要跳过它。我将Code::Blocks与MinGW64一起使用,因此我无法;还有其他选择吗?刚刚用当前的DLL再次运行DependencyWalker,现在它显示出来了Function@16没有。我试着导入它,结果成功了。但我还有一个问题:为什么我的函数运行在16位?它没有@16是堆栈激活帧的大小。4个参数,每个参数为32位4字节,4 x 4=16。