无法使用GetProcAddress()从DLL加载某些函数
Unable to load some functions from DLL with GetProcAddress()
我试图建立一个DLL,我想稍后使用SetWindowsHookEx()函数注入一些进程。奇怪的是,当我尝试加载DLL并尝试使用GetProcAddress来获取包含在其中的过程的地址时,如果我试图获取CBT消息处理过程的地址,它将返回NULL,但它适用于其他功能。
这是代码。
DLL头文件(.h)
#include <windows.h>
extern "C" {
__declspec(dllexport) LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam);
__declspec(dllexport) int add(int a, int b);
}
DLL FILE (.cpp)
#include "SimpleHook.h"
extern "C" {
__declspec(dllexport) LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(0, code, wParam, lParam);
}
__declspec(dllexport) int add(int a, int b) {
return a + b;
}
}
主文件
#include <iostream>
#include <windows.h>
#include <tchar.h>
int main(int argc, char* argv[]) {
HINSTANCE dllHandle = LoadLibrary(_T("SimpleHook.dll"));
if (dllHandle) {
// returns the correct address
cout << "add address: " << GetProcAddress(dllHandle, "add") << endl;
// returns NULL
cout << "hookProc address: " << GetProcAddress(dllHandle, "hookProc") << endl;
}
}
如果我使用GetLastError(),我得到127错误代码的含义:
ERROR_PROC_NOT_FOUND:指定的过程不能被找到。
奇怪的是,来自同一文件的其他函数被正确加载。任何帮助都非常感谢!
调用约定改变了名称混淆。__stdcall
函数的名称总是以_
为前缀,并且以其他方式进行了修改,因此链接失败,但__cdecl
函数没有修改,因此找到了它。
要从您使用__declspec(dllexport)
构建的DLL导入,您应该始终在您想要导入的所有内容上包含__declspec(dllimport)
的头,并链接您从构建DLL中获得的库。这将保证所有的函数都能正确链接,而不必使用兼容c的链接。
你不应该使用GetProcAddress
,也不应该将extern "C"
与__declspec(dllexport)
结合使用。
#include <windows.h>
#ifndef MAIN
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam);
DLL_API int add(int a, int b);
DLL .cpp文件:
#include "SimpleHook.h"
DLL_API LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(0, code, wParam, lParam);
}
DLL_API int add(int a, int b) {
return a + b;
}
主。cpp文件:
#define MAIN
#include "SimpleHook.h"
int main(int argc, char* argv[]) {
if (dllHandle) {
// returns the correct address
cout << "add address: " << add << endl;
// returns NULL
cout << "hookProc address: " << hookProc << endl;
}
}
不要忘记将库添加到链接器
CALLBACK
宏解析为__stdcall。因此,必须在函数名后面加上一个下划线字符,并将参数的大小附加到函数名后面:
cout << "hookProc address: " << GetProcAddress(dllHandle, "_hookProc@12")
<< endl;
您必须使用dumpbin
或Dependency Walker之类的工具来了解混乱的名称。
或者您可以在链接时使用DEF文件,将您选择的名称放在导出表中。
相关文章:
- Python ctypes:不会按预期加载 dll
- 在 Linux 平台的 C++ 中动态加载 DLL
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 了解加载库无法加载 DLL 的原因
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- dll 生成成功,但在加载 dll 时执行错误
- QT 加载.dll不调用解析
- 通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- C++插件不能延迟加载dll时
- Java加载DLL,该DLL从JNI中的另一个DLL导出方法
- C++ 动态加载 DLL 错误
- GHCi 无法在 Windows 上加载.dll lib(C++ lib)
- 使用C++应用程序加载 DLL
- System.DllNotFoundException:无法使用 dotnet core 加载 DLL
- 当应用程序在不同系统上运行时,无法加载DLL异常
- 如何停止二级IMPLICITLY加载DLL的DLL劫持
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- 如何在Acrobat JavaScript中加载DLL文件