//头文件中定义
typedef struct _PER_IO_DATA
{
        WSAOVERLAPPED        ol;        char                *buf;           // Buffer
        int                  buflen;        // Length of the buffer        int                  operation;     // Type of operation
#define OP_ACCEPT       0                   // AcceptEx
#define OP_READ         1                   // WSARecv/WSARecvFrom
#define OP_WRITE        2                   // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;//源文件中
lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));运行到这里时debug看到lpPerIoData->ol的对应项显示:
        WSAOVERLAPPED        ol;
"CXX0030: Error: expression cannot be evaluated"
哪位帮忙看一下这是为什么呀?这问题已经困扰好长时间了。
谢谢!

解决方案 »

  1.   

    lpPerIoData 定义了吗?
    怎么定义的?
      

  2.   

    改成:
    typedef struct _PER_IO_DATA
    {
           OVERLAPPED             ol;
           char                   *buf;           // Buffer
            int                   buflen;        // Length of the buffer        int                   operation;     // Type of operation
    #define OP_ACCEPT       0                   // AcceptEx
    #define OP_READ         1                   // WSARecv/WSARecvFrom
    #define OP_WRITE        2                   // WSASend/WSASendTo
    } PER_IO_DATA, * LPPER_IO_DATA;
    //源文件:LPPER_IO_DATA lpPerIoData = new _PER_IO_DATA;
    ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));
    看看?
      

  3.   

    两位:OVERLAPPED和WSAOVERLAPPED的大小是一样的,所以和这个也没关系,我试过将它们改成一样的也不行。
    lpPerIoData我当然定义了,否则编译能通过吗?呵呵。
      

  4.   

    ZeroMemory(&(lpPerIoData->ol),sizeof(lpPerIoData->ol));

    memset(&(lpPerIoData->ol),0,sizeof(OVERLAPPED));
      

  5.   

    OVERLAPPED和WSAOVERLAPPED的大小是一样的,
    ------------------------------------------
    这个我知道我只是想看看你是怎么定义的.单独看这段程序是看不出什么问题的,
    楼主将代码贴详细一点
      

  6.   

    代码没有问题。你的程序是不是在dll中?重新编译一下吧。
      

  7.   

    以下是我这段程序的代码,接收网络连接并投递一个异步接收操作,出现了以上的问题
    void CTreeDialog::OnAccept()
    {
    PER_HANDLE_DATA *PerHandleData = NULL;
    LPPER_IO_DATA lpPerIoData;
    SOCKADDR_IN saRemote;
    SOCKET Accept;
    int RemoteLen;DWORD RecvBytes = 0;
    DWORD Flags;RemoteLen=sizeof(SOCKADDR_IN);Accept=accept(m_sListen, (SOCKADDR*)&saRemote, &RemoteLen);
    int i=WSAGetLastError();
    if(Accept==INVALID_SOCKET) //若没接收到数据,函数返回
    return;//创建用来和套接字关联的单句柄数据信息结构
    PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
    PerHandleData->socket=Accept;
    memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);//将接受套接字和完成端口关联起来
    CreateIoCompletionPort((HANDLE)Accept, m_hCompletionPort, (DWORD)PerHandleData, 0);m_nDvNum++; //设备总数++//开始在接收套接字上处理I/O
    //使用重叠I/O
    WSABUF wbuf;
    Flags = 0;WSAEVENT Event;
    char buffer[4096];lpPerIoData = new _PER_IO_DATA; //!!!!ZeroMemory(&(lpPerIoData->ol), sizeof(WSAOVERLAPPED));Event = WSACreateEvent();
    lpPerIoData->ol.hEvent = Event;lpPerIoData->buflen=4096;
    memcpy(buffer, &"", sizeof(buffer));
    lpPerIoData->buf=buffer;wbuf.len = lpPerIoData->buflen;
    wbuf.buf = lpPerIoData->buf;lpPerIoData->operation = OP_READ;i = WSARecv(Accept, 
    &wbuf, 
    1,
    (unsigned long *)&RecvBytes,
    &Flags,
    &(lpPerIoData->ol),
    NULL);
    i=WSAGetLastError();
    delete lpPerIoData;
    }
      

  8.   

    可能是这时ol的内容没有意义,debug不能解析,可以先不管它,看看后面的代码运行如何。
      

  9.   

    我将ol以字符串输出:
    AfxMessageBox((char*)&(lpPerIoData));
    输出字符串不认识,但没有错误。
    当运行到WSARecv()时,出现异常错误;将WSARecv()的倒数第二个参数&(lpPerIoData->ol)改写成NULL,则程序正常运行,但这样不是我想要的呀。
    我实在是看不出来什么地方错了。
    help!
      

  10.   

    不是我程序的错误,是VC的问题,可能是程序写的太大了,同样的代码添加到我的低版本工程中则没有问题,于是重新添了以遍就over了。实在搞不懂。
    谢谢大家!