'생계/C/C++'에 해당되는 글 2건

  1. 2007.03.19 Process 탐지, 중복실행 방지 및 포커스 이동 2
  2. 2007.03.17 NetWork Adpater Macaddress 얻기 2

BOOL CMake3DApp::FindProc()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    BOOL bFindServer = FALSE;
    int imageCount = 0;
    LPCTSTR str = TEXT("Test.exe");
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    DWORD pid = GetCurrentProcessId(); // 자기자신의 PID
    DWORD hProc;

    if(hSnapShot)
    {
        PROCESSENTRY32* processInfo = new PROCESSENTRY32;
        processInfo->dwSize = sizeof(PROCESSENTRY32);
        int index=0;
        while(Process32Next(hSnapShot, processInfo)!=FALSE)
        {
            if(lstrcmpi(str, processInfo->szExeFile) == 0)
            {
                imageCount++;
                // hProc : 이미 실행되어 있는 Test.exe의 PID
                // pid   : 지금 실행되는 Test.exe의 PID
                if(processInfo->th32ProcessID != pid)
                {
                    hProc = processInfo->th32ProcessID;
                }
            }
        }
        CloseHandle(hSnapShot);
        delete processInfo;
    }

    if(imageCount == 1) // 실행시 Test.exe가 하나일 경우만 계속 진행(실행)
    {
        bFindServer = TRUE;
    }
    else
    {
        if(hProc)
        {   
            EnumWindows((WNDENUMPROC)EnumFunc, hProc);
            SetForegroundWindow(hwndMax); // 기 존재한 Test.exe를 최상위로.
        }
    }
    return bFindServer;
}

// EnumWindows callback함수
BOOL CALLBACK EnumFunc(HWND hwnd, LPARAM lParam) // lParm - Test.exe
{                                     // processID - winprocess
    DWORD processID;
    GetWindowThreadProcessId(hwnd, &processID);

    if(processID != DWORD(lParam))
    {
       return TRUE;
    }

    hwndMax = hwnd; // 해당 proc의 handle
    return FALSE;
}


간단한 내용임에도 불구하고,  제대로 사용법을 몰라 헤매었다. 본디 다른 데 사용할려고 여기저기 긁어모아 완성시켰던 것이었는데 이번 프로젝트에 써 먹을 수 있었다. Google만 검색해도 널려있는 내용이지만, 제대로 파악도 못해 헤매던 시절의 기억을 잊지않기 위해서라도 이곳에 기록을 남긴다.

Posted by Master 
:


 길고도 길었던 COM관련 프로젝트가 거의 종결되었다. 최종버전은 1,0,0,7.
7번의 릴리즈를 거쳐서야 그나마 안정적이라고 할만한 버전이 튀어나왔다. 이미 개발한 COM서비스 되고 있는 사이트는 오픈한지가 오래고, 몇몇 필요한 사람들의 PC에는 설치가 되었으리라. 물론 앞으로도 필요 기능이라던가 알 수 없는 버그가 발견되면, 수정이 계속되겠지만 말이지. 여하튼 프로젝트를 하면서 '구글링'이나 'CnP'로 엎어온 코드들을 조금 정리해볼 생각이다.

CString GetMacAddressFunc()
{
    CString error = "ERROR";
    PIP_ADAPTER_INFO pAdapter;       
    ULONG ulLeng;

    DWORD dwResult = GetAdaptersInfo(NULL, &ulLeng);
    if(dwResult != ERROR_BUFFER_OVERFLOW)       
        return error;

    pAdapter = new IP_ADAPTER_INFO[ulLeng];
    if(pAdapter == NULL){
        delete [] pAdapter;
        return error;       
    }
           
    dwResult = GetAdaptersInfo(pAdapter, &ulLeng);
    if((dwResult != ERROR_SUCCESS) || (pAdapter->Type != 6)){
        delete [] pAdapter;
        return error;       
    }
   
    ulLeng = pAdapter->AddressLength;
    size_t i, j;

    PBYTE pbHexMac = (PBYTE)pAdapter->Address;

    CString szResult = _T("");
    CString szTemp;

    for (i = 0, j = 0; i < ulLeng - 1; ++i) {
        szTemp = _T("");
        szTemp.Format(_T("%02X:"), pbHexMac[i]);
    szResult = szResult + szTemp;
    }

    szTemp = _T("");
    szTemp.Format(_T("%02X"), pbHexMac[i]);
    szResult = szResult + szTemp;

    delete [] pAdapter;
   
    return szResult;
}
 


 

Posted by Master 
: