GSI

몇일전 음.. 일주일이 더 된듯 하다.
다른 분이 짠 소스를 받아서 작업을 해주는 과정에서
시행착오를 많이 초래 했다.

우선 초기 컨셉 자체를 놓고 잡은 모듈은 나중에 컨셉(기획방향)이 바뀌면서
모듈을 다 들어 내는 상황을 초래 했다.

보간법을 사용함에 있어서 단순한 방법을 찾지 못한 상태에서
기존 코드를 수정한다는게 정말 힘든다는 것을 느꼈다.
쿼터니언을 사용하면서 무수히 많은 시행착오를 거쳤으며,
그 상황에서 많은 부분을 깨닳게 되었다.

하지만 쿼터니언의 문제점이라고 해야 될지
메트릭스에서 트랜스폼으로 바꿔야 하는 경우가 발생하면서
문제는 해결되지 않았다.

그래서 단순하게 몇개의 점을 사용한 메트릭스를 만들어 내도록 처리 했으며,
그 상황을 통해서 조금 해결점에 도달이 되어 가는거 같다.

프로그램은 정말이지 사람을 자꾸 발전하게 만드는것 같다.
하지만 몇일 동안의 고민은 정말 포기하고 싶다는 심적 고통을 유발하며
정말 힘들었다.

이제 마무리를 해보자꾸나.
Posted by gsi
:

소스 코드 :


Http를 통해서 해당 파일을 다운로드 받는 클래스 입니다.

// 접속
if (HttpOpenURL ("http://localhost/Azitro.cab")) {
    OutputDebugString ("HTTP open error.\n");
    ... 기타 작업 ....
    PostQuitMessage (0);
    return;
}

// 다운로드
if (PushDownloadObj (szFileName, NULL, NULL, 0, 0) == false) {
   ... 기타 작업 ...
   PostQuitMessage (0);
   return;
}

이후에 다운로드 진행사항이 보여지는 다이얼로그를 표시 하고 실제 파일을 다운로드 받고 cab 파일을 풀어서 설치 하는 과정까지 짝 있는데요 아무래도 좀더 파악하고 올려야 할듯 합니다. 제대로 데모를 하나 만들어서 ^^
필요하신분은 요청해 주세요 ^^.

Posted by gsi
:

윈도우 찾아서 종료 시키기

인스톨 프로그램과 비슷한 경우를 보면 해당 실행파일을 업데이트 할 경우가 생기게 되는데 이때 실행 파일을 종료 하고 새로운 파일을 추가한 후에 다시 실행시켜야 하는 경우가 발생 한다.

그래서 화면에 떠 있는 응용 프로그램의 타이틀이나 클래스를 검색 해서 프로세스 아이디를 얻은 다음에 프로세스를 종료 시켜야 한다.

프로그램을 실행하고 Spy++로 보게 되면 아래와 같이 보이게 됩니다.

사용자 삽입 이미지




여기서 나오는 "TestRemoteClose" 와 "#32770" 두개를 접근해서 프로세스를 처리할 수 있습니다.

아래의 함수는 os에서 현재 돌아가고 있는 각종 윈도우를 순회 하면서 내가 원하는 윈도우를 찾아 주는 코드 입니다.

BOOL CALLBACK SearchWindowProc (HWND hWnd, LPARAM lParam)
{
 char szClassName[1024]={0,}, szTitle[1024]={0,};
 char *pTitle = "TestRemoteClose", *pTitle2 = "TestRemoteClose";
 char *pDest = NULL, *pDest2 = NULL;

 GetClassName (hWnd, szClassName, sizeof(szClassName));
 GetWindowText (hWnd, szTitle, sizeof(szTitle));

#ifdef _DEBUG
 char szBuf[2048];
 wsprintf (szBuf, "Title: [%s],\tClass: [%s]\n", szTitle, szClassName);
 OutputDebugString (szBuf);
#endif

 pDest = strstr (szTitle, pTitle);
 pDest2 = strstr (szTitle, pTitle2);

 // Title 의 값에서 pTitle, pTitle2의 값을 검사해서 NULL인지를 검사한다.
 // 즉, NULL 이 아니면 해당 윈도우라고 판단한다.
 if (pDest != NULL || pDest2 != NULL) {

  //if (!strcmp (szClassName, "IEFrame")) // 웹일 경우 IEFrame로 되어 있다.
  {

   if (bIsMsgBox == false) {
    bIsMsgBox = true;
    MessageBox (NULL, "정상적인 설치를 위하여 잠시 종료합니다.", "설치 정보", MB_ICONINFORMATION);
   }

   DWORD dwProcessId = 0;
   GetWindowThreadProcessId (hWnd, &dwProcessId);

   if (dwProcessId)
    UserTerminateProcessId (dwProcessId);
  }
 }

 return TRUE;
}

// 메인쪽에서 아래 함수를 호출하면서 순회 하게 된다.
EnumWindows (SearchWindowProc, NULL);

더 자세한 내용이나 수정해야될 부분이 있다면 코멘트 부탁 드립니다.

Posted by gsi
:

어플리케이션이 실행될 OS의 타입과 빌드 번호 등을 알아 오는 데모

사용자 삽입 이미지

OSVersionChk 소스 코드 :

Posted by gsi
:

상태바를 추가 해서 툴을 적용할때 각종 정보들을 출력할 수 있습니다.

1. 리소스 기호를 추가 합니다.

사용자 삽입 이미지
2. String Table 에 추가 합니다.
사용자 삽입 이미지

3. 해당 내용을 추가 합니다.

static UINT indicators[] =
{
// ID_SEPARATOR,           // 상태 줄 표시기
 ID_INDICATOR_INFO0,      // 추가한 상태바
 ID_INDICATOR_INFO1,      // 추가한 상태바
 ID_INDICATOR_INFO2,      // 추가한 상태바
 ID_INDICATOR_INFO3,      // 추가한 상태바
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
};

4. 메인 프레임 사이즈 조정시 상태바의 크기도 조절 되도록 한다.

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
 CFrameWnd::OnSize(nType, cx, cy);

 if(m_wndStatusBar.m_hWnd != NULL)
 {
  int width = cy - 90;

  m_wndStatusBar.SetPaneInfo(0, ID_INDICATOR_INFO0, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(1, ID_INDICATOR_INFO1, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(2, ID_INDICATOR_INFO2, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(3, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, width/4);
  m_wndStatusBar.SetPaneInfo(4, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
  m_wndStatusBar.SetPaneInfo(5, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
  m_wndStatusBar.SetPaneInfo(6, ID_INDICATOR_INFO3, SBPS_NORMAL|SBPS_STRETCH, 30);
 }
}

5. 문자열을 바꿀때는 SetPaneText()를 사용한다.

m_wndStatusBar.SetPaneText(0, str0);  // 0은 인덱스, str0은 문자열

Posted by gsi
: