dll中函数原型:
int DllReturn(char* cReturn)
{
for(int n=0; n<iATRLen; n++) //
{
str.Format(“%02x”,reply.message.negativeReply.Data.bBody[n]); //reply.message.negativeReply.Data.bBody[n]这个是另外一个执行语句中得到的比较长,就没写。strBack,和 str都是CString的全局变量
strBack += str;
}
int DllReturn(char* cReturn)
{
for(int n=0; n<iATRLen; n++) //
{
str.Format(“%02x”,reply.message.negativeReply.Data.bBody[n]); //reply.message.negativeReply.Data.bBody[n]这个是另外一个执行语句中得到的比较长,就没写。strBack,和 str都是CString的全局变量
strBack += str;
}
cReturn=strBack.GetBuffer(strBack.GetLength()); //这里是能取得的。
return 0;
}
应用 工程中
char* cReceiveCmd;
cReceiveCmd=(char*)malloc(128);
DllReturn(cReceiveCmd); //取得的为空的
解决方案
10
调用时传的是动态开辟字符指针,在int DllReturn(char* cReturn)内部应该是对cReturn指针的内容进行修改,而不是对这个形参的指向进行改变(也就是不能是cReturn=xxx),这样改变的只是形参cReturn的指向而已,外部实参cReceiveCmd并没有任何变化。
试试cReturn=strBack.GetBuffer(strBack.GetLength());这句改为strcpy(cReturn ,strBack.GetBuffer(strBack.GetLength()));
试试cReturn=strBack.GetBuffer(strBack.GetLength());这句改为strcpy(cReturn ,strBack.GetBuffer(strBack.GetLength()));
5
建议使用memcpy,指针是用于存放地址的,它不能直接做到把数据拷贝到指向的内存里;
5
cReturn这个指针变量本身是一个值传递.
cReturn=strBack.GetBuffer(strBack.GetLength()); //值传递, 这里是不会改变外部的.
需要修改成memcpy, 或 strcpy都行.
strcpy(cReturn, strBack.GetBuffer(strBack.GetLength())); //这里是修改了指针指向的内存, 这就是地址传递了
cReturn=strBack.GetBuffer(strBack.GetLength()); //值传递, 这里是不会改变外部的.
需要修改成memcpy, 或 strcpy都行.
strcpy(cReturn, strBack.GetBuffer(strBack.GetLength())); //这里是修改了指针指向的内存, 这就是地址传递了
5
int DllReturn(TCHAR *cReturn) { if (cReturn != NULL) { for (int n = 0; n < iATRLen; n++) { str.Format("%02x",reply.message.negativeReply.Data.bBody[n]); strBack += str; } int cchBuffer = strBack.GetLength() + 1; if (lstrcpyn(cReturn, (LPCTSTR)strBack, cchBuffer) != NULL) { return 0; } } return (-1); }
5
指针参数是传值的