我在对话框上放一SOCKET控件 在对话框初始化函数中做SOCKET连接没问题
奇怪的是 我起了一个线程 在线程中传递进来对话框实例的指针,通过该指针调用对话框上SOCKET控件对应的成员变量的CONNECT(X,X)方法 奇怪的是每到这句就提示什么内存不能写,怎么会、这样 。。我在线程中调用SOCKET的别的方法都工作正常啊。超级郁闷!神啊 救救我吧!
奇怪的是 我起了一个线程 在线程中传递进来对话框实例的指针,通过该指针调用对话框上SOCKET控件对应的成员变量的CONNECT(X,X)方法 奇怪的是每到这句就提示什么内存不能写,怎么会、这样 。。我在线程中调用SOCKET的别的方法都工作正常啊。超级郁闷!神啊 救救我吧!
就是调用CONNECT和SENDDATA总出现某某内存不能读或写
我也知道用API做没这些问题
我是参考了别人的这种做法 为了省点事 但就是出问题了
没错,我指针学的最好了
要不 我贴出代码你看看?
CString strsqu;
CString strPath;
TCHAR exeFullPath[100];
int position;
CString temstripadd;
int temport;
VARIANT RemotePort,RemoteIp;
CString tempstr;
SAFEARRAY * psa;//安全数组
SAFEARRAYBOUND rgsabound[1];
long strlen;
char * tempch=NULL;
long tempi=0;
long len=0;
VARIANT send_var;
int connc=0;
if (((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.GetState()!=7) //7表示已连接
Sleep(60000); //等待60秒
if (((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.GetState()!=7) //7表示已连接
{
for ( connc=0;connc<3;++connc)
{
::GetModuleFileName(NULL,exeFullPath,100);
strPath=(CString)exeFullPath;
position=strPath.ReverseFind ('\\');
strPath=strPath.Left(position);
//从INI文件中读服务器端参数 ::GetPrivateProfileString("SocketInfo","服务器地址","",temstripadd.GetBuffer(100),100,strPath+"\\Config.ini");
temport=::GetPrivateProfileInt("SocketInfo","服务器端口",0,strPath+"\\Config.ini");
((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.Close();
((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.SetLocalPort(0);
//m_clientsock.SetRemotePort((long)temport);
((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.SetRemoteHost(temstripadd);
((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.SetProtocol(0); RemotePort.vt=VT_I2;
RemotePort.lVal=temport;
RemoteIp.vt=VT_BSTR;
//::AfxMessageBox(m_clientsock.GetRemoteHost());
RemoteIp.bstrVal=((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.GetRemoteHost().AllocSysString();
((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.Connect(RemoteIp,RemotePort);//SOCKET连接没连接上,重新进行连接
Sleep(60000);// 等待60秒钟 再判断状态
if (((CSmsplatmDlg * )theApp.m_pMainWnd)->m_clientsock.GetState()==7)
break;
}
if (connc==3) //调试时注意一下这句的I到底等于几
{
::AfxMessageBox("无发建立SOCKET连接");
return 0; //建立不起来SOCKET连接就退出
}
}
//再建立虚连接 for (connc=0;connc<3;++connc)
{
++(theApp.squenceno);
strsqu.Format("%08X",theApp.squenceno );
tempstr="<xsmp><message_header><command_id>00000001</command_id><command_status>0</command_status><sequence_no>"+strsqu+"</sequence_no></message_header><message_body><id>020014</id><icp>6660118</icp><ip>221.204.44.48</ip><system_id>410</system_id><password>8888</password><system_type></system_type><interface_version>10</interface_version><ton>0</ton><npi>0</npi><address_range></address_range></message_body></xsmp>";
//::AfxMessageBox(tempstr);
rgsabound[0].lLbound = 0; rgsabound[0].cElements = tempstr.GetLength()+1; // SAFEARRAY长度 psa = SafeArrayCreate(VT_UI1, 1, rgsabound);//创建类型为字节的数组
strlen=tempstr.GetLength()+1;
tempch=tempstr.GetBuffer(strlen);
tempi=0;
for(len=0;len<strlen;len++)
{
if (*(tempch+len)>127)
tempi=128-*(tempch+len); else
tempi=*(tempch+len);
SafeArrayPutElement(psa, &len, &tempi);//缓冲区数据入安全数组
}
send_var.vt=VT_ARRAY|VT_UI1;
send_var.parray=psa;
//数据发送
//测试用的消息框
::AfxMessageBox("guo!");
((CSmsplatmDlg * )(theApp.m_pMainWnd))->m_clientsock.SendData(send_var); 各位兄弟 就是SENDATA这句老过不去提示:提示“0x22177c42”指令引用的“0X00000044”内存,该内存不能为“read”
我看了多遍 安全数组什么都没有越界,,,什么问题?请大家帮忙看看 谢了 --