gpt4 book ai didi

c++ - 无法使用 GetProcAddress() 从 DLL 加载某些函数

转载 作者:太空狗 更新时间:2023-10-29 20:00:25 24 4
gpt4 key购买 nike

我正在尝试构建一个 DLL,稍后我想使用 SetWindowsHookEx() 函数将其注入(inject)到某些进程中。奇怪的是,当我尝试加载 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 文件 (.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: The specified procedure could not be found.

奇怪的是同一文件中的其他函数被正确加载。非常感谢任何帮助!

最佳答案

调用约定更改了名称修饰。 __stdcall 函数的名称总是以 _ 为前缀,并且也以其他方式被破坏,因此链接失败,但 __cdecl 函数不是损坏,所以它被发现。

要从使用 __declspec(dllexport) 构建的 DLL 导入,您应该始终包含一个带有 __declspec(dllimport) 的 header 您想要导入和链接从构建 DLL 获得的库的所有内容。这将保证您的所有函数都正确链接,并且您不必使用与 C 兼容的链接。

您不应将 GetProcAddressextern "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;
}
}

不要忘记将库添加到链接器。

关于c++ - 无法使用 GetProcAddress() 从 DLL 加载某些函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com