首页 > 解决方案 > 如何使用函数的参数作为 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 中获取值?

谢谢!

标签: c++pointersdllreturn-valuedllexport

解决方案


您的导出定义也不正确。应该是这样的:

#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);

推荐阅读