C++, MFC

블랙아이즈 2010. 11. 23. 19:53

IE8의 경우 기본적으로 탭 당 프로세스가 1개씩 띄도록 되어있는 구조라 ActiveX 등을 IE로 디버그하기 위해 이용할 수가 없습니다. 즉, ActiveX가 로드된  IE 프로세스가 Visual Studio와 연결된 IE 프로세스와 다르기 때문입니다.


디버그하기 위한 방법이 있는데, IE 프로세스를 1개만 띄도록 하는 것입니다.
아래와 같이 레지스트리에 IE관련 항목을 추가하면 됩니다.

1. 레지스트리 에디터를 연다.
2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main 키를 연다.
3. TabProcGrowth 라는 DWORD 값을 추가한다.
4. TabProcGrowth의 값을 0으로 설정한다.

 
 
 

C++, MFC

블랙아이즈 2009. 12. 1. 15:25

다중선택 옵션을 준 CFileDialog 을 사용하였을 경우

 

전체 파일의 경로 길이가 기본값보다 크면 DoModal 의 리턴이 IDCANCEL 이 된다.

 

이 부분의 해결 방법으로는 파일 경로들의 길이를 늘려줘야 한다.

:

:

// 다중 선택 갯수를 300 으로 가정했을 경우

CString  strFileName;

int nMaxFiles = 300;
int nBuffSize = (nMaxFiles * (MAX_PATH +1)) + 1;
 
m_ofn.lpstrFile = strFileName.GetBuffer(nBuffSize);
m_ofn.nMaxFile = nBuffSize;

:

:

DoModal();

strFileName.ReleaseBuffer();

 
 
 

C++, MFC

블랙아이즈 2009. 10. 22. 13:13

윈도우, 프로세스, 모듈
    - 핸들, ID, 파일이름

    파일이름 만으로 전체 경로 얻기 GetFullPathName(  sFileName,   _MAX_PATH,  sFullFull,  0);
                                        -> 문제 : 현재 경로에 파일름만 붙인다.
                        GetFullPath()(만듬) : 파일일 현재 실행된 파일의 경로에 있는 검사해서 붙인다.

* 윈도우

    윈도 Instance : (SDK) GetWindowLong(hWndCur, GWL_HINSTANCE),   (MFC)HINSTANCE AfxGetInstanceHandle();
    현재 Window Handle    : GetCurrentWindowHandle(만듬)   
    Process Handle (ID) -> Window Handle : HWND GetWindowHandleFromProcessId(DWORD dwProcId) (만듬)   

* 프로세스

    현재 Process Handle : HANDLE GetCurrentProcess(VOID);
    현재 Process ID        : DWORD GetCurrentProcessId(VOID);
    프로세스(모듈) 파일 이름  : GetModuleBaseName(hProc, 0, sNameOnly, _MAX_PATH);//이름만
                      GetModuleFileName(0, sFullPath, _MAX_PATH);//전체경로
    Win Handle -> Process Handle : GetWindowThreadProcessId
    파일이름 -> Process ID : GetProcessIdFromName(만듬)
    파일이름 -> Process Handle : GetProcessHandle(만듬), 2가지 방식, OpenProcess, CreateProcess
    Process ID -> Process Handle : GetProcessId() , API인데 MSDN 설명이 안나옴

    GetCurrentProcessorNumber() ??
    GetCurrentActCtx()??

* 모듈

    현재 Module Handle    : GetCurrentModule(만듬)
    파일이름 -> 모듈핸들 : GetModuleHandle();//현재 프로세스에서만 작동
                        특정프로세스 안에 있는 모듈 핸들 GetModuleHandle()(만듬), 외부 프로세스에서 작동
    모듈ID -> 모듈 핸들 :

* 쓰레드

    현재 쓰레드 핸들    : GetCurrentThread()
    현재 쓰레드 ID        : GetCurrentThreadId()


   
*/

 

 


  1. #include <psapi.h>
    #pragma comment (lib, "psapi.lib")

    //===============================================================================
    static HWND shWndCurWnd;

    BOOL CALLBACK cbfEnumWindowsProc(  HWND hWnd, LPARAM lParam )
    {
        shWndCurWnd =0;
        DWORD PID=0, TID=0;
        TID = ::GetWindowThreadProcessId (hWnd, &PID);
       
        if( (DWORD)lParam == PID){
            shWndCurWnd=hWnd;
            return FALSE;
        }

        return TRUE;
    }

    //프로세스 ID로 윈도우 핸들 얻기
    //현재 한개의 외부함수(cbfEnumWindowsProc)와 외부 변수(shWndCurWnd) 사용
    //차후 프로세스정보를 이용한 한개의 함수로 개선
    HWND GetWindowHandleFromProcessId(DWORD dwProcId)
    {
        shWndCurWnd=0;

        BOOL b = EnumWindows( cbfEnumWindowsProc,  dwProcId );

        if( (b==FALSE) &&(shWndCurWnd!=0)){
            return shWndCurWnd;
        }

        return 0;
    }
    //===============================================================================

    //현재 윈도우 핸들 얻기
    HWND GetCurrentWindowHandle()
    {   
        return GetWindowHandleFromProcessId(GetCurrentProcessId());
    }


    //현재 모듈 핸들 얻기
    HMODULE GetCurrentModuleHandle()
    {
        MEMORY_BASIC_INFORMATION   mbi;  
        static   int   dummy;  
        VirtualQuery(   &dummy,   &mbi,   sizeof(mbi)   );  
       
        return   reinterpret_cast<HMODULE>(mbi.AllocationBase);  
    }

    //파일이름 -> Process ID : GetProcessId(만듬)
    DWORD GetProcessIdFromName(TCHAR *sProcName)
    {
        DWORD dwFlags = TH32CS_SNAPPROCESS;
        DWORD dwProcessID = 0;
        BOOL fOk;
        int i=0;

        HANDLE hSnapshot = CreateToolhelp32Snapshot(dwFlags, dwProcessID);
        PROCESSENTRY32 pe = { sizeof(pe) };

        fOk = Process32First(hSnapshot, &pe);
        int    nLen = _tcslen(sProcName);
       
        do
        {           
            if(_tcsnicmp(pe.szExeFile, sProcName, nLen) == 0)
            {
                return pe.th32ProcessID ;
            }       
        }
        while( (fOk=Process32Next(hSnapshot, &pe)) != false );

        return 0;
    }


    //프로세스 안의 모듈 핸들을 찾는다.
    //모듈 ID보다 이름을 찾는데는 핸들이 용이
    //OpenProcess를 이용하는 방법도 있지만. 프로세스를 열기 않고 실행하기 위해 CreateToolhelp32Snapshot, ?? 차후 테스트
    HANDLE GetModuleHandle( DWORD dwProcessId, TCHAR *sModuleName)
    {
        BOOL            bRet;
        bool            bFound      = false;
        HANDLE            hModuleSnap = NULL;
        MODULEENTRY32    me32        = {0};
        int                nLen = _tcslen(sModuleName);

        hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
        if (hModuleSnap == INVALID_HANDLE_VALUE)    
            return false;   

        me32.dwSize = sizeof(MODULEENTRY32);

        bRet = Module32First(hModuleSnap, &me32);
        while (bRet && !bFound)
        {   
            if(_tcsnicmp(me32.szModule, sModuleName, nLen) == 0)
            {           
                //bFound = true;
                //return me32.th32ModuleID;
                return me32.hModule;
            }
            bRet = Module32Next(hModuleSnap, &me32);
        }
        CloseHandle (hModuleSnap);

        return 0;
    }

    //Process Handle 구하기
    //OpenProcess 이용
    //ID->HANDLE
    HANDLE GetProcessHandleFromOP(DWORD dwProcId)
    {   
        HANDLE hProcess = 0;

        hProcess = ::OpenProcess(
            PROCESS_ALL_ACCESS, // Specifies all possible access flags
            FALSE,
            dwProcId//pProcess->Get_ProcessId()
            );
        if( !hProcess )
            return 0;
        else
            return hProcess;
    }

    //Process Handle 구하기
    //OpenProcess 이용
    //파일이름 -> Process Handle
    HANDLE GetProcessHandleFromOP(TCHAR *sFileName)
    {
        DWORD dwProcId = 0;
        HANDLE hProcess = 0;
       
        dwProcId = GetProcessIdFromName(sFileName);
        return GetProcessHandleFromOP(dwProcId);
    }

    /*
        파일이름 만으로 전체 경로 얻기 GetFullPathName(  sFileName,   _MAX_PATH,  sFullFull,  0);
                                            -> 문제 : 현재 경로에 파일름만 붙인다.
                            GetFullPath()(만듬) : 파일일 현재 실행된 파일의 경로에 있는 검사해서 붙인다.
    */
    BOOL GetFullPath(TCHAR* sFullPath, int nMax, TCHAR *sFileName)
    {
        HMODULE hMod = GetCurrentModuleHandle();
        DWORD sSize = GetModuleFileName(hMod, sFullPath, nMax);
        if(sSize >0){
            strcpy( strrchr(sFullPath,_T('\\'))+1, sFileName);
            return TRUE;
        }
        return FALSE;
    }