MFC 에는 몇가지 유용하지만, 사용자들에게 알려지지 않은 함수들이 있습니다.
물론 오늘 살펴볼 AfxExtractSubString() 또한 그런 함수입니다.

AfxExtractSubString() 함수에 대해서는 어떠한 도움말도 참고할수도 없는데,
실제로 MFC 예제에서 위의 함수를 찾아보면 몇몇의 예제가 위의 함수를 사용하고 있는것을 찾을 수 있습니다.

함수가 하는일은 간단합니다.

특정한 문자를 기준으로 sub-string 을 추출하는 함수인데요.

예를들어 다음과 같은경우에 사용하고 있습니다.

아시는 분들이 많지 않겠지만,

MFC AppWizard 가 자동으로 만들어 주는 IDR_MAINFRAME 라는 리소스 스트링에는 프로그램의 이름, document type 그리고 default document type 의 파일에 대한 확장자와 같은 유용한 정보가 있습니다.

그래서 이러한 유용한 정보를 얻기 위해서 다음과 같이

AfxExtractSubString() 함수를 사용할 수 있답니다.

CString fullstring, appname, fileext;
fullstring.LoadString(IDR_MAINFRAME); // 전제 문자열을 읽습니다.
AfxExtractSubString(appname, fullstring, 0, '\n'); //첫번째 sub-string
AfxExtractSubString(fileext, fullstring, 4, '\n'); //4번째 sub-string

앞으로 여러분들이 AfxExtractSubString() 를 함수를 사용하면,
parsing 을 잘못하여 생기는 문제를 막을 수 있겠네요. ^^.
--------------------------------------------------------------------------
여기까지는 퍼온 글이고
내가 이해하기 쉬운 예제를 넣어봐야지

CString str = "192.168.0.1";
CString strA, strB, strC, strD;
AfxExtractSubString(strA, str, 0, '.'); // strA == "192"
AfxExtractSubString(strB, str, 1, '.'); // strB == "168"
AfxExtractSubString(strC, str, 2, '.'); // strC == "0"
AfxExtractSubString(strD, str, 3, '.'); // strD == "1"

위와 같이 나온다.

물론 Win32에 strtok() 함수가 있기는 하지만 MFC 환경에서 작업을 많이하는 요즘에는
AfxExtractSubString() 함수가 더 유용해 보인다.
strtok() 함수도 다음글에 적어본다.
블로그 이미지

요다할아범

,

자꾸 까먹는다....

VS6으로 개발할때 다이얼로그에 사용되는 버튼, 프로그레스바, 스태틱바 등등의 컨트롤을 가지고 있는
도구모음을 닫았을때 다시 여는 방법을 말이다.

벌써 VS6 사용한지 어언 햇수로 7년이 되어 가지만...

이것만은 항상 바로 생각나지 않고

고민하게 된다.

흑흑...

이러다 몇년 지나면 아예 기억을 못할지도 모른다.

그러기전에 적어놔야지... ㅡ.ㅡ(무슨 메멘토냐?)

어쨌든

메뉴 있는데서 오른쪽 마우스를 지긋이 누르면 나오는 메뉴에서 Controls 선택하면

뿅 나온다.

...
...

왜 이렇게 슬퍼지지?

블로그 이미지

요다할아범

,
그런데 이 방법대로 Vista + VB6 개발 환경에서 컴파일 하고 실행해보니 에러가 발생하더군요.

사용자 삽입 이미지

이렇게 컴파일된 실행 파일은 Vista 뿐만 아니라 XP에서 실행시켜도 에러가 발생합니다.

Vista + VB6 + RC.EXE + VB 리소스 편집기 ... 뭔가 문제가 있는 듯 한데 추가적인 테스트는 시간 관계상 다음으로 미룹니다. ^^



▣ 이 글에서는 Vista + VB6 개발 환경에서 위 에러를 피할 수 있는 두 가지 방법을 설명합니다.

[1] manifest 정보를 별도 파일로 관리.
manifest 정보는 실행 파일에 리소스로 포함시키지 않더라도 다음의 명명 규칙에 따라 실행 파일과 같은 폴더에 텍스트 파일로 넣어두기만해도 적용됩니다.

실행 파일(확장자 포함)명 + ".manifest"

예를들어 실행 파일명이 vb_amdin.exe인 경우 vb_admin.exe.manifest 이름으로 저장하면 됩니다.

요즘들어 Vista와 호환되는 유틸리티가 배포되고 있는데 일부 프로그램에서는 위 방법을 이용하고 있습니다. (Ex. Total Commander 7)


[2] VB2005의 mt.exe 사용
이전 글에서 mt.exe를 이용하는 방법에 대해서도 언급했었는데, 이 방법을 이용하는 경우에는 문제가 발생하지 않았습니다.

mt -manifest app_name.exe.manifest -outputresource:app_name.exe;#1

manifest 정보를 리소스로 포함시켜서 배포하겠다면 이 방법을 이용하면 됩니다.


▷ 개발 및 테스트하는 경우, 컴파일 할 때마다 매번 mt.exe를 실행하는 것은 귀찮은 작업이 될테니 컴파일하는 폴더에 manifest 파일을 저장해두면 좀 더 수월하게 진행할 수 있을겁니다.


(간단한 예제 소스와 함께 mt.exe 실행 파일이 있습니다.)


▣ 첨부파일 설명
    ▷ 압축을 풀면 루트에 프로젝트 소스와 함께 Manifest, mt 2개의 폴더가 있습니다.
    ▷ Manifest
        - Vista에서 열어보면 방패 표시가 있는데, 이것은 같은 폴더에 있는 manifest 파일 때문입니다.
        - manifest 파일을 삭제하고 실행하면 일반 사용자 권한으로 실행됨을 확인할 수 있습니다.
    ▷ mt
        - Vista에서 열어보면 방패 표시가 있는데, 이것은 mt.exe를 이용해서 minifest 정보를 포함했기 때문입니다.
        - manifest 파일을 삭제하고 실행하더라도 Admin 권한으로 실행됩니다.

--  출처 : EnjoyDev.com(www.enjoydev.com) --
블로그 이미지

요다할아범

,
Vista에서는 UAC(User Account Control, 사용자 계정 관리) 기능을 통해 프로그램 실행에 대한 권한을 강화했는데, 일반 사용자 권한으로 실행되는 프로그램에서는 시스템 폴더, Program Files 폴더, 레지스트리 제어 등에 있어 많은 제약이 따르게된다.

UAC 기능을 고려하지 않은 프로그램을 Admin 권한으로 실행하는 방법은 다음과 같다.

    1. Vista 제어판을 통해 UAC 기능을 중지 시킨다. (비추)
        - UAC 기능이 불편함을 초래할 수는 있으나, 사용자 모르게 임의로 실행되는 악성
          프로그램 등으로부터 보호하는 기능을 가지고 있으므로 가급적 사용을 권장한다.
    2. 실행 파일에서 오른쪽 버튼 클릭 후 "관리자 권한으로 실행" 메뉴 선택
        - 경우에 따라 Admin 권한을 부여하기 위한 일회성 방법이다.
        - "사용자 계정 컨트롤"의 권한 상승 화면을 거쳐야 한다.
    3. 실행 파일의 속성->호환성 탭에서 "관리자 권한으로 이 프로그램 실행" 체크
        - 속성 변경 후에는 자동으로 Admin 권한으로 실행된다.
        - "사용자 계정 컨트롤"의 권한 상승 화면을 거쳐야 한다.
        - 파일명을 변경하거나 위치(폴더)를 이동하는 경우, "권한 수준" 내용을 초기화 된다.

 
Vista에서 Admin 권한으로 실행되는 프로그램을 만들기 위해서는 manifest 파일을 리소스에 포함시키면 되는데 VB6의 리소스 편집기에서는 manifest 리소스 관리를 지원하지 않으므로 [1]VS6의 rc.exe 프로그램을 이용해서 리소스 파일을 만들고 이 리소스 파일을 포함해서 컴파일한다. 또는 [2]VS2005의 mt.exe를 이용해서 이미 컴파일 된 프로그램에 manifest 정보를 추가한다.

[1] manifest 리소스 정보를 포함해서 컴파일하는 방법

1) manifest 파일 만들기
    - 다음의 내용을 텍스트 파일로 저장한다. (파일명 : "app_name.exe.manifest")
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="AdminApp"
     type="win32"/>

  <description>Description of your application</description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>

        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>


2) ResourceScript 파일 만들기
    - 다음의 내용을 텍스트 파일로 저장한다. (파일명 : ResourceScript.rc)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST                     24
CREATEPROCESS_MANIFEST_RESOURCE_ID   RT_MANIFEST    "app_name.exe.manifest"


3) rc.exe 를 이용한 리소스 파일 만들기
    - 도스창에서 다음의 명령을 입력해서 리소스 파일을 만든다.
    - "c:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\" 폴더에 있다.
"RC.EXE" /r /fo app_name.res ResourceScript.rc


4) VB 프로젝트에 리소스 파일 추가
   - VB에서 프로젝트->파일 추가 메뉴를 통해 3)에서 만든 리소스 파일(app_name.res)을 프로젝트 리소스 파일로 등록한다.

5) 프로젝트 컴파일

6) Vista의 UAC 사용 환경에서 테스트


[2] VS 2005의 mt.exe를 이용하는 방법

1) Admin 권한 부여를 위한 프로그램(EXE) 준비

2) manifest 파일 만들기 ([1]과 동일)

3) 실행 파일에 manifest 정보 추가하기

mt -manifest app_name.exe.manifest -outputresource:app_name.exe;#1


4) Vista의 UAC 사용 환경에서 테스트


※ manifest 적용 후에는 다음 그림처럼 방패 모양이 추가되는 것을 볼 수 있다. (Vista에서 확인 가능)
사용자 삽입 이미지 사용자 삽입 이미지


※ manifest 적용 및 테스트를 위한 예제 프로젝트



-- 출처 : EnjoyDev.com(www.enjoydev.com) --
블로그 이미지

요다할아범

,
원본 http://www.zdnet.co.kr/builder/dev/etc/0,39031619,10066417,00.htm
 
 
나만의 CD 제작 프로그램 만들기
윈도우 XP IMAPI를 이용한 CD Burn 프로그래밍
현륜식 ( ZDNet Korea )   2004/02/11
 
윈도우 XP는 IMAPI를 이용해 단순히 끌어서 놓거나 보내기를 통해 CD-R이나 CD-RW로 CD를 구울 수 있습니다. 여기서는 윈도우 XP에 내장된 IMAPI를 이용해 윈도우 XP와 같은 CD Burn 프로그램을 구현해 보고 향후 IMAPI가 어떻게 변화해 갈 지 전망해 봅니다.
현 재 윈도우 XP는 컴퓨터를 사용하는데 필요한 기능을 모두 가지고 있습니다. 그 중에 가장 눈에 띄는 것이 새롭게 내장된 CD Burn 기능입니다. 이 기능은 MS의 요청에 따라 아답텍에서 만든 IMAPI(Image Mastering API)를 이용하는데, 이지CD 크리에이터의 다이렉트 CD와 같다고 생각하면 됩니다.

기존에 이지CD 크리에이터 사용자라면 혹시 엔진이 불안정하지 않을까 생각할 지도 모릅니다. 실제로 아답텍의 이지CD 크리에이터는 프로그램의 불안정으로 인한 잦은 패치로 사용자들의 불만을 샀기 때문입니다. 초기에 윈도우 XP에 내장된 IMAPI도 이지CD 크리에이터나 네로(Nero) Burn 등의 다른 프로그램과의 호환성 문제 및 CD 기록기기와의 문제가 있었지만 지금은 거의 다 해결된 상태이므로 걱정할 필요는 없습니다.

CD Burn 프로그램 설계·구현
CD에 파일을 저장하거나 복사할 때 운영체제는 사전에 하드 드라이브에 이미지를 마스터한 후 CD를 굽게 됩니다. 이때 사전 마스터링은 기록 과정상에 에러가 생기는 것을 방지하고 고속 기록시에 미디어가 필요 없이 렌더하는 것을 최소화합니다. IMAPI는 이 이미지를 마스터링(혹은 CD Burn)하는 API라는 뜻으로, 현재 줄리엣(Jolliet)과 ISO9660 형식의 데이터 디스크와 레드북 형식의 오디오 디스크를 지원하고 있습니다.

IMAPI와 COM 객체
IMAPI에는 네 개의 주요 COM 객체와 인터페이스가 있습니다.

① MSDiscMasterObj
② MSDiscRecorderObj
③ MSDiscStashObj
④ MSBurnEngineObj

MSDiscStashObj와 MSBurnEngineObj 객체는 IMAPI에 접근하는 내부 인터페이스로, IMAPI 아키텍처를 쉽게 이해할 수 있도록 간단히 언급만 되어 있습니다. MSDiscStashObj(IDiscStash 인터페이스를 통해)는 MSDiscMasterObj에 이용되는 Raw 파일(800MB까지 허용)로 구워질 오디오 이미지나 데이터 디스크라고 생각하면 됩니다. 이 Stash는 로우 레벨 엔진으로부터 굽기가 요청되면(IMSBurnEngine 인터페이스를 통해) MSBurnEngineObj로 건네집니다.

그 외 MSDiscMasterObj 객체는 다음 다이어그램처럼 세 개의 인터페이스를 제공합니다. 그 중 IDiscMaster 인터페이스는 IMAPI 열기와 지원 포맷 나열하기, 포맷 선택하기, 레코더 리스트 보이기, 레코더 선택하기, 굽기, IMAPI 닫기 등을 할 수 있습니다.

사용자 삽입 이미지
<그림 1> IMAPI v1 아키텍처

그리고 IJolietDiscMaster와 IRedbookDiscMaster 인터페이스는 각각 데이터와 오디오 디스크를 컨트롤하며 IDiscMaster 인터페이스를 통해 포맷을 선택한 후 사용할 수 있습니다. 또 MSDiscRecorderObj 객체는 IDiscRecorder 인터페이스를 통해 접근할 수 있습니다. IMAPI와 호환되는 모든 CD-R과 CD-RW 디바이스는 MSDiscRecorderObj 객체를 가지고 있으며, CD 굽기에 사용될 디바이스를 선택하기 위해 MSDiscRecorderObj 객체의 IDiscRecorder 인터페이스 포인터를 사용합니다. 이를 통해 굽는 속도와 다른 여러 변수들을 설정할 수 있습니다.

이 외에 CD를 굽기 위해 ICDBurn 인터페이스를 사용할 수 있는데 이는 윈도우 셸로, CD에 파일을 쓰기 한 하드웨어가 시스템에 있는지 알아보고 그 디바이스의 drive letter를 알아낼 수 있습니다. 또 staging 파일을 CD로 만들 수 있는데, 이 역시 IMAPI를 기반으로 만들어져 있습니다.

사용자 삽입 이미지
 
<그림 2> MSDiscMasterObj

 


Code Project - CD Burner : http://www.codeproject.com/win32/CD_Burner.asp
블로그 이미지

요다할아범

,