我在对话框上放一SOCKET控件 在对话框初始化函数中做SOCKET连接没问题 
奇怪的是 我起了一个线程 在线程中传递进来对话框实例的指针,通过该指针调用对话框上SOCKET控件对应的成员变量的CONNECT(X,X)方法 奇怪的是每到这句就提示什么内存不能写,怎么会、这样 。。我在线程中调用SOCKET的别的方法都工作正常啊。超级郁闷!神啊 救救我吧!

解决方案 »

  1.   

    谢谢FLYELF 控件肯定存在 我在线程中调用该控件的别的方法都没问题
    就是调用CONNECT和SENDDATA总出现某某内存不能读或写
      

  2.   

    肯定是参数中含有指针部分错了,顺便问一下lonelyeaglecao,你以前是不是学vb的
      

  3.   

    其实 我是学C的 会学的VB 
    我也知道用API做没这些问题
    我是参考了别人的这种做法 为了省点事 但就是出问题了
    没错,我指针学的最好了
    要不 我贴出代码你看看?
      

  4.   

    我把代码贴出来 各位看看什么问题
    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”  
    我看了多遍 安全数组什么都没有越界,,,什么问题?请大家帮忙看看 谢了  --
      

  5.   

    线程中使用Windows类型变量是不安全的,建议用自定义消息的形式通知主线程进行相应的操作。
      

  6.   

    我把对控件的调用封装到对话框的方法里,线程里不直接调用WINSOCK变量,但还是内存不能读或不能写。WHY?
      

  7.   

    搂住你检查一下你在传入你的dialog指针候你的线程中的指针变量是否是有效的。你想可能是在线程中你的dialog指针变量已经不再是你dialog的原始指针了.