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

}

最佳答案

问题出在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

关于c++ - 从DLL获取char *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15041733/

10-12 23:05