파일 버전 읽기

// 버전 체크

// 함수1 : 자기 자신의 버전을 읽어서 ptr 에 복사한다. ptr ~ ptr+7 사용

BOOL GetMyVersion(LPBYTE ptr)
{
       CString filename;
       filename = __argv[0];         // 자기 자신의 파일 이름 읽기
       VS_FIXEDFILEINFO        *fileinfo=NULL, easy;        // 쿼리 함수에서 할당해 준다.. 포인터의 포인터를 넘긴다!!
       DWORD dwHandle, dwVersionInfoSize        = GetFileVersionInfoSize(filename, &dwHandle);
                                                                               // 전체 버전 정보 받을라꼬!
       _ASSERTE(dwVersionInfoSize != 0);
       if(dwVersionInfoSize == 0)
               return FALSE;
       
       LPBYTE lpBuffer = new BYTE [dwVersionInfoSize];
       BOOL bStatus = GetFileVersionInfo(filename, /* Ignored */dwHandle, dwVersionInfoSize, lpBuffer);
       if(!bStatus)                                                // 데이터 받아오고...
       {
               delete lpBuffer;
               return FALSE;
       }

       UINT uLength;                        
       bStatus = VerQueryValue(lpBuffer, TEXT("\"), (LPVOID*)&fileinfo, &uLength);
       if(bStatus)
       {
               TRACE("%d %d %xn", /* major */HIWORD(fileinfo->dwFileVersionMS), /* MINOR */ LOWORD(fileinfo->dwFileVersionMS), fileinfo->dwFileVersionLS);
               memcpy(ptr, &fileinfo->dwFileVersionMS, sizeof(DWORD));
               memcpy(ptr + sizeof(DWORD) , &fileinfo->dwFileVersionLS, sizeof(DWORD));
               delete lpBuffer;
               return TRUE;
       }
       delete lpBuffer;
       return FALSE;
}



ex)
BOOL bStatus = GetMyVersion(tmpBuffer + 50);
Posted by 김모작자

댓글을 달아 주세요

Classwizard 도움없이

CAxWindow.Create 로 실제 보여줄 윈도우를 만들고
CAxWindow 의 IAxWinHostWindow 를 쿼리해서 얻고
IAxWinHostWindow 에서 CreateControl 로 필요한 컨트롤을 생성한다

CAxWindow axObject;
CComPtr<IAxWinHostWindow>       spHost;

axObject.Create(m_hWnd, rect, NULL, WS_CHILD | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);

axObject.QueryHost(&spHost);
spHost->CreateControl( [CLSID], axObject, NULL );

axObject.QueryControl( [interface implemented object] );

-----------------
CAxWindow, CComPtr 은 atlbase.h 를 포함해야 한다.

-----------------
Dialog 등에 ActiveX 컨트롤을 올리기 보다 위에 방식으로 올리게 되면 실제 사용시만 로드하면 되기 때문에 초기 로드 시간 등을 줄일 수 있다.
Posted by 김모작자
TAG CAxWindow

댓글을 달아 주세요

UINT   uState;
  CRect rcTaskbar;
  APPBARDATA abd;

  m_nSystemHeight = ::GetSystemMetrics(SM_CYSCREEN);
  m_nSystemWidth = ::GetSystemMetrics(SM_CXSCREEN);

  // 작업표시줄의 정보를 구함
  abd.cbSize = sizeof(APPBARDATA);
  abd.hWnd  = ::GetDesktopWindow();
  ::SetRect(&abd.rc, 0, 0, m_nSystemWidth, m_nSystemHeight);
  ::SHAppBarMessage(ABM_GETTASKBARPOS, &abd);

  uState = ::SHAppBarMessage(ABM_GETSTATE, &abd);

  rcTaskbar = abd.rc;

  switch(abd.uEdge)

  {
  case 0: // 왼쪽
    break;
  case 1: // 위쪽
    break;
  case 2: // 오른쪽
    break;
  case 3: // 아래쪽
    break;
  }

  // 작업표시줄이 자동 숨김인 경우
  if(uState & ABS_AUTOHIDE)
  {
  }
Posted by 김모작자

댓글을 달아 주세요

선언부에
       // editbox
       CContainedWindow        m_EditCtrl;

추가
생성자에 추가로
       :m_EditCtrl(_T("EDIT"), this, 1)
해서 초기화 하고

ALT_MSG_MAP(1)
  WM_IME_CHAR 추가
여기서 1은 위에 1과 같은 번호이다

나머지 코드는...
LRESULT CMyCompositeControl::OnEditImeChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
       static char kk[3];

       kk[0] = (char) (wParam & 0xff);
       kk[1] = (char) (wParam >> 8);
       m_EditCtrl.SendMessage(EM_SETSEL, 0, -1);
       m_EditCtrl.SendMessage(EM_SETSEL, -1, 0);
       m_EditCtrl.SendMessage(EM_REPLACESEL, FALSE, (LPARAM) kk);
       bHandled = TRUE;
       return 0;
}
Posted by 김모작자

댓글을 달아 주세요

간혹 인터넷을 하다 보면
http, ftp 등 익숙한 프로토콜 이름이 아닌 mms, rtp, rts, edonkey 등 못 보던 프로토콜 이름을 봤을 것이다. 해당 링크를 클릭하면 특정 프로그램이 반응하도록 되어 있는데, 이 기능을 구현하는 방법을 설명해보겠다 -0-/

아래 내용, 제목은 MSDN 이 출처이니 아쉬운 사람은 더 찾아 보도록!

protocol
://URL/sub/sub/file
웹페이지에 해당 protocol 이 포함된 링크가 포함되었을 때 반응하는 어플리케이션 정의

응응프로그램이 특정 URL 프로토콜을 취급하도록 하려면, HKEY_CLASSES_ROOT 레지스트리에 적정 키와 값을 추가해야한다

새로운 레지스트리 키는 추가될 특정 protocol scheme(http 같은)와 일치해야 한다. 예를 들어, note: 라는 프로토콜을 추가하려면, HKEY_CLASSES_ROOT 에 추가될 키 이름은 note 여야한다.
이 레지스트리 키에 (기본값) 에는 새로운 프로토콜의 이름이 들어가야 하고, URLProtocol 문자열 값에는 프로토콜의 정보나 빈 문자열이 들어가야 한다. 그리고 하위에 DefaultIcon 이 꼭
추가되어야 한다. DefaultIcon 의 (기본값)에는 이 프로토콜에 사용할 아이콘으로 사용될 파일 이름이 들어가야 한다. Shell 키도 반드시 들어가야 한다. 그리고 하위에 open 등의 DDEEXEC 명령이
들어가야 한다.
------------ MSDN 원문 -------------------------------------------------
To enable an application to handle a particular URL protocol, you must add a new key, with the appropriate keys and values, to the registry in HKEY_CLASSES_ROOT.

The new registry key must match the protocol scheme that is being added. For instance, to add the protocol note:, the key added to HKEY_CLASSES_ROOT should be note. Under this new key, the Default string value should be the name of the new protocol, and the URLProtocol string value should contain either protocol-specific information or an empty string. Also under the new key, a DefaultIcon key and a shell key should be added. The Default string value under the DefaultIcon key must be the file name to use as an icon for this new URL protocol. Under the shell key, a key using a verb (such as open) should be added. A command key and a DDEEXEC key can be added under the key using a verb. The values under the command and DDEEXEC keys are used to call the application.

The following example shows which registry values must be added to register a new application (notepad.exe in this example) to handle a new URL protocol (note:).

[HKEY_CLASSES_ROOT]
  [note]
    (Default) = "URL:Note Protocol"
    URL Protocol = ""
    [DefaultIcon]
       (Default) = "notepad.exe"
    [shell]
       [open]
          [command]
            (Default) = "c:windowsnotepad.exe %1"

By adding these settings to the registry, attempts to navigate to URLs such as note:c:myfile.txt would launch Notepad to edit the file c:myfile.txt. Of course, all the commands supported under ShellOpen are supported, including DDEEXEC (in other words, "command" is not the only key you can put under the verb).
Posted by 김모작자

댓글을 달아 주세요