c++ - 如何在C++中使用函数的参数作为指针从DLL返回值?

标签 c++ pointers dll return-value dllexport

我有一个简单的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)++;
}
chh
#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)和导入(客户端, undefined #MYDLL_EXPORT)使用相同的宏(MYDLLDIR)
在这种情况下,您必须在所有地方对callByPtr使用相同的调用约定
__stdcall(默认值是__cstdcall)。
然后在您的pch.h中:
MYDLLDIR void __stdcall callByPtr(int *i);

关于c++ - 如何在C++中使用函数的参数作为指针从DLL返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63951075/

相关文章:

c++ - 如何在 C++ 中将字符串转换为 HexBytes 数组?

外部文件函数中的 C 指针赋值

c++ - 使用 GHC 64 位构建的普通 Windows DLL 不链接

c++ - 系统错误 - "the code cannot proceed because .dll was not found."

c++ - 平凡可复制的值表示与可能不可复制的值表示之间是否存在显着差异

c++ - CMake source_group 不适用于 Qtcreator

c++ - 用于字符串的容量值

c++ - void* 和 char* 的区别

c++ - 如何将对象指针存储在数组中

python - 嵌入式Python(C API): How to run . py文件重复而不重新初始化