c++ - 如何使用函数的参数作为 C++ 中的指针从 DLL 返回值?
问题描述
我有一个简单的 DLL:
dllmain.cpp:
#define MYDLLDIR
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
...
}
void callByPtr(int *i) {
(*i)++;
}
pch.h
#include "framework.h"
#ifdef MYDLLDIR
#define DLLDIR __declspec(dllexport) __stdcall
#else
#define DLLDIR __declspec(dllimport)
#endif
extern "C" {
DLLDIR void callByPtr(int *i);
};
客户:
typedef void(__stdcall* callByPtr)(int*);
int main()
{
HINSTANCE hDLL;
hDLL = LoadLibrary(_T("MyDll.dll"));
if (NULL != hDLL)
{
callByPtr myCall = (callByPtr)GetProcAddress(hDLL, "callByPtr");
if (!myCall) {
return EXIT_FAILURE;
}
int i = 10;
int* ptri = &i;
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
myCall(ptri);
std::cout << "---- After Call ----\n";
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
}
}
结果:
---- 通话前 ----
我 = 10
ptri = 0025FB40
---- 通话后 ----
我 = 11286192
ptri = 0025FB3C
ptri 的地址变了,值不是 11。
如何正确实现这一点,以便我可以使用上述方法从 DLL 中获取值?
谢谢!
解决方案
您的导出定义也不正确。应该是这样的:
#ifdef MYDLL_EXPORT
#define MYDLLDIR __declspec(dllexport)
#else
#define MYDLLDIR __declspec(dllimport)
#endif
并为导出(dll,#MYDLL_EXPORT 已定义)和导入(客户端,#MYDLL_EXPORT 未定义)使用相同的宏(MYDLLDIR)
您必须在所有地方对 callByPtr 使用相同的调用约定,在您的情况下为 __stdcall(默认为 __cstdcall)。
然后在您的 pch.h 中:
MYDLLDIR void __stdcall callByPtr(int *i);
推荐阅读
- javascript - 传单在显示位置重复时提供无效的 Lng/Lat 坐标
- python - 使用 selenium python 循环遍历元素时遇到问题
- typescript - 空传播函数类型注释
- c++ - 尝试在 opencv 4.5.1 中使用 SIFT 提取特征时出现问题
- myhdl - MyHDL 0.11 在一个简单的解复用器实现上出错
- ios - 如何使用预定功能更改 Firestore 文档中的布尔值?
- python - 如何在显示 QMenu 时将鼠标焦点转移回来?
- javascript - 数组javascript中具有相同id值的超大数据
- c++ - C++:用于创建聚合类的结构设计模式,其成分表达了他们想要公开的内容
- java - 从 OpenJDK16 读取使用 keytool 创建的 PKCS12 密钥库时,Java 8 中的 IOException