我到是有在WIN2000能运行在WIN98里不能运行的程序。
你说的对,就在writefile函数这里,要注意各种参数的设计。
同时你还得注意CreateFile函数里面的参数,因为参数不同可能引起问题。

解决方案 »

  1.   

    debug了一下,确实是参数错误。
    没有使用creatfile,而是使用的openfile和createvent结合的方法。
    估计应该是createvent的句柄传递错误。
      

  2.   

    mygo,能否细述一下你遇到过的情况吗?
    openfile,createvent两个函数都没有问题。writefile的时候,
    DWORD nNumberOfBytesToWrite,     // number of bytes to write
    参数是能够得到值的(4096);
    但是
    LPDWORD lpNumberOfBytesWritten,  // pointer to number of bytes written
    怎么着也是个0,也就是说半个字儿也没有写进去!!!
    我个人觉得问题出在最后一个参数:
    LPOVERLAPPED lpOverlapped        // pointer to structure for overlapped I/O
    上面。这参数的HANDLE就是CREATEVENT返回的HANDLE,
    再看CREATEVENT函数,他的第一个参数:
    LPSECURITY_ATTRIBUTES lpEventAttributes,
                          // pointer to security attributes
    程序的取值是NULL,在WIN98下边的含意是no security,但是在nt下边是一个default security,会不会是这里的问题?老板催的比较急,请教各位大侠了!
      

  3.   

    CreateFile中是不是用了FILE_FLAG_OVERLAPPED,而在WriteFile中没有用LPOVERLAPPED 变量,这在win98下是能用的,但在win2000下就不行了。
    建议在CreateFile中不用FILE_FLAG_OVERLAPPED。而在WriteFile也不用LPOVERLAPPED变量。
      

  4.   

    可以用超时设置来代替使用异步I/0。
    另外,win2000的串口设置与win98有一点不一样。如: dcb.fOutxCtsFlow =FALSE;
    fOutxDsrFlow =FALSE;
    fDtrControl =DTR_CONTROL_ENABLE;
    fRtsControl =RTS_CONTROL_ENABLE;
      

  5.   

    ComX.hCom[i-1] = CreateFile(
    szPort,                                         //lpfilename;
    GENERIC_READ|GENERIC_WRITE,                     //DesiredAccess ;
    0,                                              //Share mode;
    NULL,                                           //security attribute;
    OPEN_EXISTING,                                   //open existing     files;if file doesn't exist,fail;
              FILE_ATTRIBUTE_NORMAL,                           //file attribute;
    //FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,       //file attribute;
    NULL                                              //handle to file with attributes to copy;
              );
    显然,这里的comX.hCom[i-1]没有使用OVERLAPPED属性。而后面的WriteFile:
      

  6.   

    WriteFile(ComX.hCom[i-1], buffer, dwRead, &dwWrite, lpWrite)一样的没有使用OVERLAPPED变量,而后面的指针lpWrite确实是指向OVERLAPPED结构的指针,但那也是标准参数设置,应该没有问题啊。
    写的方向是向ComX.hCom[i-1]写,这样子的话,两个函数都没有使用OVERLAPPED函数啊。
      

  7.   

    DWORD writtenCount;
    OVERLAPPED o;
    o.Offset =0;
    o.OffsetHigh =0;
    o.hEvent = CreateEvent(
    NULL,   // no security attributes 
    FALSE,  // auto reset event 
    FALSE,  // not signaled 
    NULL    // no name 
    ); ::WriteFile (gHandle,lpBuf,nCount,&writtenCount,&o);
      LPVOID lpMsgBuf;
    FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
    );
    // Process any inserts in lpMsgBuf.
    // ...
    // Display the string.
    MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    // Free the buffer.
    LocalFree( lpMsgBuf );
    看一看到底哪里出错。        
      

  8.   

    我想测试出来的错误可能就是参数错误。需要这样用:
    WriteFile(ComX.hCom[i-1], buffer, dwRead, &dwWrite,NULL);