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,会不会是这里的问题?老板催的比较急,请教各位大侠了!
没有使用creatfile,而是使用的openfile和createvent结合的方法。
估计应该是createvent的句柄传递错误。
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,会不会是这里的问题?老板催的比较急,请教各位大侠了!
建议在CreateFile中不用FILE_FLAG_OVERLAPPED。而在WriteFile也不用LPOVERLAPPED变量。
另外,win2000的串口设置与win98有一点不一样。如: dcb.fOutxCtsFlow =FALSE;
fOutxDsrFlow =FALSE;
fDtrControl =DTR_CONTROL_ENABLE;
fRtsControl =RTS_CONTROL_ENABLE;
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:
写的方向是向ComX.hCom[i-1]写,这样子的话,两个函数都没有使用OVERLAPPED函数啊。
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 );
看一看到底哪里出错。
WriteFile(ComX.hCom[i-1], buffer, dwRead, &dwWrite,NULL);