VC 调用多次后出错,有关char*的 pRcvValue = RunPro(i_TempBuf, i_ComnIndex);是否改变pRcvValue的地址了? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是memcpy(pRcvValue, RunPro(i_TempBuf, i_ComnIndex), 1024)吧? 你是不是返回了一个局部变量的指针,返回给pRcvValue 了?这样肯定有问题 Runpro主要是对下位机进行操作的命令,没有什么局部变量的指针。typedef char* (_stdcall *TRunPro)(char*, long); //运行程序char* RunPro(char* v_pTelNum, long v_pComn)//运行程序{// CString str; if (!g_hMyMiscDLL) return FALSE; TRunPro func = (TRunPro)GetProcAddress(g_hMyMiscDLL, "RunPro"); if(!func) { FreeLibrary(g_hMyMiscDLL); return FALSE; } return (char*)func(v_pTelNum, v_pComn); }调用DLL的过程 DLL中是用Delphi写的//3、运行程序function RunPro(ClientID:PChar;CommPort:integer):PChar;begin CtrlOption:=TCtrlOption.create(Application); Ctrloption.MsCommctrl.CommPort:=CommPort; CtrlOption.CMDWord:='B2'; Ctrloption.ReceiveCMD:='CA'; CtrlOption.ReceiveL:=4; CtrlOption.GrpID:=shortstring(ClientID); Ctrloption.send(shortstring(ClientID)+'00'); result:=PChar(string(Ctrloption.ReceiveStr)); CtrlOption.MsCommctrl.Destroy; pub.Destroy;end; return (char*)func(v_pTelNum, v_pComn);已经把pRcvValue的地址改了。楼主的debug时,记录一下new时的地址,然后再比较pRcvValue = RunPro(i_TempBuf, i_ComnIndex);之后的地址 debug后查看时,new时显示是0x00b96f08"",函数调用后,返回的是0x00de24a4"15",当返回值pRcvValue中,引号中包含数字时,就没问题,一旦引号中什么也没有,i_OneValue = (int)pRcvValue[0];就出错。 RunPro 增加一个参数,把你的pRcvValue 传进去,然后把内容拷贝到你pRcvValue 所指的空间里我不懂delphi的代码但是怀疑你是指向了局部变量的指针 函数中返回了指针,事先就不需要分配了。由于是Delphi分配的,也许用delete[]删除会有问题,改成free()试试。 char *pRcvValue = new char[1024]; memset(pRcvValue, 0, 1024); pRcvValue = RunPro(i_TempBuf, i_ComnIndex); i_OneValue = (int)pRcvValue[0]; delete []pRcvValue ;莫名其妙,既然RunPro返回一个char指针,何必自己去new呢?char *pRcvValue = RunPro(i_TempBuf, i_ComnIndex);这样不就行了 Avoid 你的方法早就采用过了,不行我才换成这样的。 你改成这样试试,估计是你的new和delete出的问题char *pRcvValue; pRcvValue = RunPro(i_TempBuf, i_ComnIndex); i_OneValue = (int)pRcvValue[0]; 不是上面的问题,程序出错时DLL的返回值,和正长时一样。所以很郁闷 char *pRcvValue = new char[1024]; char* pBackup = pRcvValue;.....delete [] pBackup; 这样行不行? pRcvValue = RunPro(i_TempBuf, i_ComnIndex); 这个这要赋值后, pRcvValue 的值到底有没有改?如果改了的话,楼主前七次没报错也是碰巧的.后面delete的不是前面new的那个值,而是从函数返回的值? 浏览器布局是在解析之后 那界面又是怎么生成的啊 问一个查询语句 一个关于 CIPAddressCtrl 的问题 请高手支招!不是高手的支声也行!非阻塞的SOCKET莫明其秒被阻塞了。。。 指针的强制类型转换是什么样的原理?这样会带来什么不安全的后果? 请教: 一个小问题,是关于VC++NET的 寻求opengl画立体图形的代码 问一个很面的问题 为什么我的ClassWizzard里面没有WM_NCHITEST消息,另外很多消息都没有。怎么才能显示出来呢? OpenCV 如何识别图象中的印刷体文字 有用过mciSendCommand来播放mp3的马?关于资源泄漏的问题
typedef char* (_stdcall *TRunPro)(char*, long); //运行程序
char* RunPro(char* v_pTelNum, long v_pComn)//运行程序
{
// CString str;
if (!g_hMyMiscDLL)
return FALSE; TRunPro func = (TRunPro)GetProcAddress(g_hMyMiscDLL, "RunPro");
if(!func)
{
FreeLibrary(g_hMyMiscDLL);
return FALSE;
} return (char*)func(v_pTelNum, v_pComn);
}
调用DLL的过程
//3、运行程序
function RunPro(ClientID:PChar;CommPort:integer):PChar;
begin
CtrlOption:=TCtrlOption.create(Application);
Ctrloption.MsCommctrl.CommPort:=CommPort;
CtrlOption.CMDWord:='B2';
Ctrloption.ReceiveCMD:='CA';
CtrlOption.ReceiveL:=4;
CtrlOption.GrpID:=shortstring(ClientID);
Ctrloption.send(shortstring(ClientID)+'00');
result:=PChar(string(Ctrloption.ReceiveStr));
CtrlOption.MsCommctrl.Destroy;
pub.Destroy;
end;
楼主的debug时,记录一下new时的地址,然后再比较pRcvValue = RunPro(i_TempBuf, i_ComnIndex);之后的地址
函数调用后,返回的是0x00de24a4"15",当返回值pRcvValue中,引号中包含数字时,就没问题,
一旦引号中什么也没有,i_OneValue = (int)pRcvValue[0];就出错。
我不懂delphi的代码但是怀疑你是指向了局部变量的指针
由于是Delphi分配的,也许用delete[]删除会有问题,改成free()试试。
memset(pRcvValue, 0, 1024);
pRcvValue = RunPro(i_TempBuf, i_ComnIndex);
i_OneValue = (int)pRcvValue[0];
delete []pRcvValue ;
莫名其妙,既然RunPro返回一个char指针,何必自己去new呢?char *pRcvValue = RunPro(i_TempBuf, i_ComnIndex);这样不就行了
char *pRcvValue;
pRcvValue = RunPro(i_TempBuf, i_ComnIndex);
i_OneValue = (int)pRcvValue[0];
所以很郁闷
char* pBackup = pRcvValue;
.....
delete [] pBackup; 这样行不行?
如果改了的话,楼主前七次没报错也是碰巧的.
后面delete的不是前面new的那个值,而是从函数返回的值?