1

我有个问题。我的 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

}
4

1 回答 1

3

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

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

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

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

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

于 2013-02-23T15:00:24.240 回答