重要的参考winapi没有mfc的操作

来源:互联网 发布:压声喊麦软件效果器 编辑:程序博客网 时间:2024/06/06 08:41
// api3333.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>#include <stdio.h>#include <stdlib.h>HANDLE hcomm;HANDLE WriteEvent;HANDLE WriteExitEvent;OVERLAPPED m_ov;COMSTAT comstat;DWORD dwBytesRead;BOOL bRead = true;int n;int h;char d[100];ProcessErrorMessage(char* ErrorText)//?{char* Temp = new char[200];LPVOID LpMegBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,          NULL,          GetLastError(),          0,          (LPTSTR)&LpMegBuf,          0,          NULL          );sprintf(Temp,"WARNING: %s Failed with the following error:\n%s\nport:%d\n",ErrorText,LpMegBuf,"COM3");MessageBox(NULL,Temp,"Application Error",MB_ICONSTOP);LocalFree(LpMegBuf);delete[] Temp;return true;}bool openport(char* portname)//????{    hcomm = CreateFile(portname,   GENERIC_READ|GENERIC_WRITE,   0,   NULL,   OPEN_EXISTING,   FILE_FLAG_OVERLAPPED,   NULL   );    if (hcomm == INVALID_HANDLE_VALUE){    DWORD dwopenerror = GetLastError();printf("open comport error:%u\n",dwopenerror);CloseHandle(hcomm);    return false;}    else         return true;}bool setupdcb(int rate_arg){DCB dcb;int rate = rate_arg;memset(&dcb,0,sizeof(dcb));if(!GetCommState(hcomm,&dcb))return FALSE;dcb.DCBlength = sizeof(dcb);dcb.BaudRate = rate;dcb.Parity = NOPARITY;dcb.fParity = 0;dcb.StopBits = ONESTOPBIT;dcb.ByteSize = 8;    if(!SetCommState(hcomm,&dcb))return false;elsereturn true;}bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,  DWORD WriteTotalMultiplier,DWORD WriteTotalconstant){COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout = ReadInterval;timeouts.ReadTotalTimeoutConstant = ReadTotalconstant;timeouts.ReadTotalTimeoutMultiplier = ReadTotalMultiplier;timeouts.WriteTotalTimeoutConstant = WriteTotalconstant;timeouts.WriteTotalTimeoutMultiplier = WriteTotalMultiplier;if(!SetCommTimeouts(hcomm,&timeouts))return false;else return true;}writechar(LPVOID lpoutbuff){BOOL bWrite = true;BOOL bResult = true;DWORD BytesSent = 0;if(bWrite){m_ov.Offset = 0;m_ov.OffsetHigh = 0;bResult = WriteFile(hcomm,lpoutbuff,n,&BytesSent,&m_ov);if(!bResult){DWORD dwError = GetLastError();switch(dwError){case ERROR_IO_PENDING:{BytesSent = 0;bWrite = false;break;}default:{ProcessErrorMessage("WriteFile()");//?}}}}if(!bWrite){bWrite = true;bResult = GetOverlappedResult(hcomm,&m_ov,&BytesSent,true);if(!bResult){            ProcessErrorMessage("GetOverlappedResult() in WriteFile()");//?}}return true;}DWORD ReadComm(LPVOID lpBuf){    DWORD dwError;BOOL bReadState;DWORD dwErrorFlags;    ClearCommError(hcomm, &dwErrorFlags, &comstat);    dwBytesRead=comstat.cbInQue;DWORD dwBytesToRead=comstat.cbInQue;    if(dwBytesRead >= 1)bReadState = ReadFile(hcomm,lpBuf,dwBytesToRead,&dwBytesRead, &m_ov);    if(!bReadState) // ??????     {switch(dwError = GetLastError()){case ERROR_IO_PENDING:{printf("GetLastError == ERROR_IO_PENDING\n");bRead = false;break;}default:{break;}}}if(!bRead){bRead = true;bReadState = GetOverlappedResult(hcomm,&m_ov,&dwBytesRead,true);}    if(!bReadState){            ProcessErrorMessage("GetOverlappedResult() in ReadFile()");//?}    return dwBytesRead;}DWORD WINAPI readthread(LPVOID pParam){int i;DWORD read;DWORD dwEventMask = 0;char rbuff[1024];for(;;){SetCommMask(hcomm,EV_RXCHAR|EV_ERR);WaitCommEvent(hcomm, &dwEventMask, &m_ov);if(dwEventMask == EV_RXCHAR){read = ReadComm(rbuff);if(read > 0){printf("the received string:\n");for(i=0;i < dwBytesRead;i++)printf("%c",rbuff[i]);                printf("\n");}}if(dwEventMask == EV_ERR){printf("Error");}}return true;}DWORD WINAPI writethread(LPVOID pParam){WriteEvent=CreateEvent(NULL,false,false,NULL);    WriteExitEvent=CreateEvent(NULL,false,false,NULL);    HANDLE EventArray[2];EventArray[0]=WriteEvent;EventArray[1]=WriteExitEvent;int Done = 0;    while(!Done){DWORD dwRes=WaitForMultipleObjects(2,EventArray,false,INFINITE);switch(dwRes){case WAIT_FAILED:{printf("waitfailed\n");break;}case WAIT_OBJECT_0:{writechar(d);//??????break;}case WAIT_OBJECT_0 + 1:{Done=true;break;}}}return true;}void main(){int DONE = 1;bool open;open = openport("COM1");if(open)printf("open comport success!\n");elseprintf("open comport failure!\n");if(setupdcb(9600))printf("setup DCB success!\n");else printf("setup DCB failure!\n");    if(setuptimeout(1000,1000,1000,1000,1000))printf("setup timeout success!\n");elseprintf("setup timeout failure!\n");PurgeComm(hcomm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);if(PurgeComm == 0){printf("PurgeComm fall!\n");}else{printf("PurgeComm success!\n");}HANDLE hreadthread = CreateThread(NULL,0,readthread,0,0,NULL);//??????HANDLE hwritethread = CreateThread(NULL,0,writethread,0,0,NULL);do{gets(d);    n=strlen(d);    char END[]="end";    if(strcmp(d,END)==0){SetEvent(WriteExitEvent);DONE=0;}    else{if(n>0)SetEvent(WriteEvent);}}while(DONE);CloseHandle(hwritethread);    CloseHandle(hreadthread);}