C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[45733] Re:Cport에서 사용중인 포트 확인?
장성호 [nasilso] 2658 읽음    2006-07-19 18:53
다른 방법이 있는지 잘모르겠습니다.
API로 CreateFile해서 문제가 없으면 사용중이지않는것이겠죠?...

아래 샘플 코등 있는데...
int OpenComPort(int nPort)  함수에서 CreatFile 한후
결과값 확인하신 부분만 보시면 될것 같습니다.

//샘플코드...
bool  CheckComport( int iSerialNumber)
{
    if(OpenPort(iSerialNumber)>0)
    {
           CloseComPort(iSerialNumber);
           return true; //사용할수 있는경우
    }
    else
         return false;//사용할수 없는경우..
}

이상입니다.

//------------------------------------
HANDLE hCommPort;
OVERLAPPED OVL;
HANDLE hEndComPortEvent,hThreadCom;
int iCommPort;
char gszPort[16];


/ Opens the com. port (1 = COM1) and returns its ID value.
// If an error occurs, the return value is negative
int OpenComPort(int nPort)
{
    char szPort[10];
    int iStatus;
    DWORD dwError;
    COMMTIMEOUTS CommTimeOuts;
    BOOL fSuccess =0;

    wsprintf(szPort, "COM%d", nPort);


    hCommPort = CreateFile(szPort,
                            GENERIC_READ | GENERIC_WRITE, 0,
                            NULL, OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL
                            );

    if(hCommPort == INVALID_HANDLE_VALUE) { //Port번호에 문제가 있거나 사용중인경우등..
        iStatus = GetLastError();
        DisplayOpenError(iStatus); 
        return -1;
    }


    if(!hEndComPortEvent) {
        //--- 쓰레드의 동기화
        hEndComPortEvent = CreateEvent (
                                NULL,   // no security attributes
                                TRUE,   // auto reset event
                                FALSE,  // not signaled
                                NULL    // no name
                                );
    }

    if  (hEndComPortEvent == NULL) {
        MessageBox (NULL, TEXT("Unable CreateEvent Process"),TEXT("Error"), MB_OK);
        dwError = GetLastError();
        return -2;
    }


    // setup device buffers
    if (!SetupComm(hCommPort, 4096, 4096))  {
        MessageBox (NULL, TEXT("Unable SetupComm Function"),TEXT("Error"), MB_OK);
        dwError = GetLastError();
        return -3;
    }


    // set up for overlapped non-blocking I/O
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 5000;

    SetCommTimeouts(hCommPort, &CommTimeOuts);

    // Make an overlapped structure for i.o.
    memset(&OVL,0,sizeof(OVL));

    OVL.hEvent = CreateEvent(
                            NULL,   // no security attributes
                            TRUE,  // auto reset event
                            FALSE,  // not signaled
                            NULL    // no name
                            );
    if  (OVL.hEvent == NULL) {
        MessageBox (NULL, TEXT("Unable OVL.hEvent Function"),TEXT("Error"), MB_OK);
        dwError = GetLastError();
        return -4;
    }

    // Set the mask for the events you want to listen for
    fSuccess = SetCommMask(hCommPort,EV_RXCHAR | EV_RXFLAG);

    if(!fSuccess) {
        MessageBox (NULL, TEXT("Unable SetCommMask Function"),TEXT("Error"), MB_OK);
        dwError = GetLastError();
        return -5;
    }
   
    return 1;

}

// Closes the comm. port specified by nPortID
// returns TRUE if success, FALSE if failure
BOOL CloseComPort(int nPortID)
{
    if (nPortID < 0)
        return FALSE;

    if(hCommPort != INVALID_HANDLE_VALUE) {
        CloseHandle(hCommPort);
        hCommPort = INVALID_HANDLE_VALUE;
    }

    FlushBuffers(nPortID);


    if(hEndComPortEvent)
        CloseHandle(hEndComPortEvent);
    hEndComPortEvent=0;

    if(OVL.hEvent)
        CloseHandle(OVL.hEvent);
    OVL.hEvent = NULL;

    return TRUE;
}

김성준 님이 쓰신 글 :
: Cport로 통신 프로그램을 하나 만들었습니다.
:
: Com1을 통해 통신을 주고받는데 다른 프로그램에서 Com1을 사용중일 경우
:
: 이를 검사해서 메세지를 띄우려고 합니다.
:
: 어떤 방법을 써야 할까요?
:
: 읽어주셔서 감사합니다.

+ -

관련 글 리스트
45731 Cport에서 사용중인 포트 확인? 김성준 1394 2006/07/19
45915     Re:Cport에서 사용중인 포트 확인? 권기식.with☆ 1670 2006/07/29
45733     Re:Cport에서 사용중인 포트 확인? 장성호 2658 2006/07/19
45738         Re:Re:감사합니다. 김성준 1052 2006/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.