我有问题。我的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
}
答案 0 :(得分:3)
问题在于function
。您通过值传递outVal
,这意味着您在函数内部的指针是您传入的指针的副本。然后您使用outVal = (char*)pemBuf.data;
指定该指针。您所做的就是修改副本。外面没有变化。
这不是您的方法的唯一问题。您还尝试将指针传递给即将超出范围的对象的成员。 pemBuf
具有自动存储持续时间(因为它是function
的本地存储持续时间),这意味着它将在返回时被销毁。然后你的指针将指向一个无效的对象。
相反,您要做的是将pemBuf.data
的内容复制到outVal
指向的数组元素。您可以使用std::copy
或strcpy
执行此操作。但是,您还有另一个问题,即您没有传递缓冲区的大小(我不知道pemBuf.data
数组的大小)。假设你知道要复制多少N
,你可以这样做:
std::copy(pemBuf.data, pemBuf.data + N, outVal);
但是,您的代码非常类似C - 使用C风格的字符串,输出参数等。我建议您开始使用std::string
。