//头文件中
typedef struct _PER_IO_DATA
{
        WSAOVERLAPPED        ol;        char                *buf;           // Buffer  
        int                  buflen;        // Length of the buffer        int                  operation;     // Type of operation issued
#define OP_ACCEPT       0                   // AcceptEx
#define OP_READ         1                   // WSARecv/WSARecvFrom
#define OP_WRITE        2                   // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;//源文件中
WSABUF wbuf;
Flags = 0;
WSAEVENT Event;
char buffer[4096];
char buffer[4096];lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));
           //运行到这里时debug看到lpPerIoData->ol的对应项显示:
           //"CXX0030: Error: expression cannot be evaluated"
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,
                &RecvBytes,
                &Flags,
                &(lpPerIoData->ol),
wbuf.len = lpPerIoData->buflen;
                NULL);  //此处出现了异常错误!?delete lpPerIoData;/////////////////////////////////////////////////////////////////
是不是上面的lpPerIoData->ol导致的异常错误呢?
怎么解决呢?
小弟调了两天了!
万分感谢!

解决方案 »

  1.   

    WSAOVERLAPPED和OVERLAPPED结构体不同,你不应该那样初始化
    ZeroMemory(&(lpPerIoData->ol), sizeof(WSAOVERLAPPED ));
      

  2.   

    薄荷老大,WSAOVERLAPPED和OVERLAPPED虽然结构不同但是他们的sizeof结果是相同的呀;
    那样写应该没错吧;
      

  3.   

    i = WSARecv(Accept,
                    &wbuf,
                    1,
                    &RecvBytes,
                    &Flags,
                    &(lpPerIoData->ol),
    wbuf.len = lpPerIoData->buflen;
                    NULL);
    这段贴的有点问题吧;是不是应该是这样的:
    i = WSARecv(Accept,
                    &wbuf,
                    1,
                    &RecvBytes,
                    &Flags,
                    &(lpPerIoData->ol),
                    NULL); 
    wbuf.len = lpPerIoData->buflen;
    如果是这样那么你用了异步操作,那么最后一个参数能为空么?
      

  4.   

    我试了一下,还是一样的问题呀?
    还有其他问题??
    郁闷ing...
      

  5.   

    to: topwork(日光) 
    你说的那段是我的笔误,程序里不是那么写的,对不起:)
    我用的是完成端口,最后一个参数是空的。
      

  6.   

    怎么看调用栈信息啊?
    在哪里看呢?
    我感觉就是lpPerIoData->ol初始化的问题,但我找不出来。