【问题标题】:Get char * from DLL从 DLL 中获取 char *
【发布时间】:2013-02-23 14:46:00
【问题描述】:

我有问题。我的 dll 中有一个函数,定义如下:

int function(char *inVal, char *outVal, int *retVal)

我使用 LoadLibrary 在控制台应用程序中成功加载了我的 dll,并使用函数指针调用了我的函数:

typedef int (__cdecl *functionPtr)(char *, char *,int *);

然后我将我的 inVal 传递给我的函数:

char * inVal = "input";

现在我想获得我的 outVal 和 retVal,我已经成功获得了 retVal 但我的 outVal 为 NULL:

int retVal = 0;
char outVal[200] = {0};

然后我调用我的函数:

int return = functionLNK(inVal , outVal, &retVal)

有什么线索吗?!!

编辑 1:

代码如下:

int function(char *inVal, char *outVal, int *retVal) 

{

PKI_Buf inBuf, signBuf, pemBuf;

......


outVal = (char*)pemBuf.data;

//I check outVal in this point and it is not NULL

}

【问题讨论】:

  • 我检查了我的 dll 中的日志,我的 dll 中的 outVal 不是 NULL
  • 你的意思是char outVal[200] = {0};
  • DLL中的函数呢?您确定它正确更改了该缓冲区的内容吗?
  • @Amir:你能把DLL中函数的代码显示一下吗?
  • @AndyProwl 现在已经确认了。通灵很棒。

标签: c++ dll char loadlibrary


【解决方案1】:

问题在于function。您通过值传递outVal,这意味着您在函数内的指针是您传入的指针的副本。然后您使用outVal = (char*)pemBuf.data; 分配给该指针。您所做的只是修改了副本。外面没有变化。

不过,这不是您的方法的唯一问题。您还试图将指针传递给即将超出范围的对象成员。 pemBuf 具有自动存储期限(因为它是 function 本地的),这意味着它会在返回时被销毁。那么你的指针将指向一个无效的对象。

相反,您要做的是将pemBuf.data 的内容复制到outVal 指向的数组元素中。您可以使用std::copystrcpy 执行此操作。但是,您还有另一个问题是您没有传递缓冲区的大小(而且我不知道 pemBuf.data 数组的大小)。但是,假设您知道要复制多少 N,您可以这样做:

std::copy(pemBuf.data, pemBuf.data + N, outVal);

但是,您的代码非常类似于 C - 使用 C 风格的字符串、输出参数等。我建议你开始使用std::string

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多