본문 바로가기
C & C++/C & C++

[MFC] Sheel 프로그래밍

by izen8 2011. 4. 25.

(SHELL) 프로그래밍

1. 의미

폴더 및 파일을 관리하거나 애플리케이션의 실행 등에 대한 기능을 제공하는 API 함수를 Shell API라고 하며 Shell API 함수를 이용한 프로그래밍을 Shell 프로그래밍이라고 합니다.

제공하는 기능으로는 폴더관리, 파일 시스템 관리, 애플리케이션 실행 등을 제공합니다.

 

2. 폴더 찾아보기

파일 공통 대화 상자로는 파일을 선택할 수 있지만 폴더를 선택할 수는 없습니다.

폴더를 선택할 수 있도록 해주는 함수는 SHBrowseForFolder 함수입니다.

1) 폴더 찾아보기 함수의 원형

LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)

LPBROWSEINFO의 구조체 변수를 통해서 구현됩니다.

 

2) LPBROWSEINFO의 모양

typedef struct _browseinfo

{

        HWND hwndOwner; // 이 대화상자를 소유하고 있는 윈도우의 핸들

        LPCITEMIDLIST pidlRoot; // 나타내어야 할 루트 폴더

        LPSTR pszDisplayName; // 선택된 객체의 폴더 명을 넣기 위해 할당된 버퍼

        LPCSTR lpszTitle; // 트리뷰 컨트롤의 상단에 표시될 title

        UINT ulFlag; // 윈도우의 모양과 행동을 지정

        BFFCALLBACK lpfn; // 이 대화상자로 오는 메세지를 후킹하기 위한 콜백함수

        LPARAM lParam; // 콜백 함수로 전달되는 lParam

        int iImage; // 선택된 객체의 아이콘의 인덱스가 들어갈 버퍼

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

위의 멤버 중에서 uFlag를 이용해서 다양한 형태의 대화상자를 구현할 수 있습니다.

 

3)uFlags의 값

BIF_BROWSEFORCOMPUTER: 컴퓨터 이름만 선택 가능

BIF_BROWSEINCLUDEFILES: 폴더와 함께 파일 표시

BIF_BROWSEINCLUDEURLS: 폴더와 URL 표시

BIF_EDITBOX: 입력할 수 있는 에디트가 표시

BIF_NEWDIALOGSTYLE: 대화상자의 크기 조절이 가능

BIF_NONEWFOLDERBUTTON: 새 폴더 만들기 버튼을 표시하지 않음

BIF_RETURNONLYFSDIRS: 폴더 명만을 반환

4) 예제

적당한 메시지에 작성

CString m_DestPath;

// 선택한 폴더나 파일명을 받기 위한 변수

LPITEMIDLIST pidlBrowse;

// 대화상자의 리턴 값을 받기 위한 변수

BROWSEINFO BRinfo;

BRinfo.hwndOwner = GetSafeHwnd();

BRinfo.pidlRoot = NULL;

BRinfo.pszDisplayName = m_DestPath.GetBuffer(MAX_PATH);

BRinfo.lpszTitle = TEXT("폴더를선택하세요.");

BRinfo.ulFlags = BIF_RETURNONLYFSDIRS;

// 폴더 명 반환

// BRinfo.ulFlags = BIF_BROWSEINCLUDEFILES;

// 파일 명 까지 반환

BRinfo.lpfn = NULL;

BRinfo.lParam = 0;

pidlBrowse = SHBrowseForFolder(&BRinfo);

if(pidlBrowse != NULL)

{

        SHGetPathFromIDList(pidlBrowse, m_DestPath.GetBuffer(MAX_PATH));

}

AfxMessageBox(m_DestPath);


 

3. ShellExcute 함수

폴더 및 파일에 다양한 기능을 수행할 수 있는 함수

1) 기능

파일 또는 프로그램 실행

탐색기 폴더 실행

파일 찾기 실행

 

2) 함수의 원형

HINSTANCE ShellExecute(

HWND hwnd,

// 윈도우 핸들

LPCTSTR lpOperation,

// 실행할 기능 지정

LPCTSTR lpFile,

// 작업 대상 파일이나 경로 지정

LPCTSTR lpParameters,

//lpFile에 지정되는 파일이 실행될 때 인자로 전달되는 값

LPCTSTR lpDirectory,

//기본 경로 지정

INT nShowCmd

// 실행되는 모양

)

 

3) lpOperation nShowCmd

lpOperation

- edit: 문서 편집기 실행

- explore: 지정된 경로가 기본으로 표시되는 탐색기 실행

- find: 지정된 경로를 기본 검색 경로로 하는 파일 검색 창 실행

- open: 실행 파일 실행, 문서 파일 오픈, 탐색기 실행 등의 기능을 실행

- print: 지정된 파일을 프린터로 인쇄

 

nShowCmd

SW_HIDE: 실행하면서 화면에서 숨김

SW_SHOW: 실행

SW_SHOWMAXIMIZED: 최대화해서 실행

SW_SHOWMINIMIZED: 최대화해서 실행

4) 예제

적당한 메시지에 작성

4. SHFileOperation() 함수

파일의 복사, 이동, 삭제, 이름 변경이 가능하도록 해주는 함수

1) 함수의 원형

int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);

 

2) LPSHFILEOPSTRUCT 구조체

typedef struct _SHFILEOPSTRUCT 

{

    HWND hwnd; // 윈도우 핸들

    UINT wFunc;// 실행할 기능

    LPCTSTR pFrom;// 소스 파일명

    LPCTSTR pTo;// 대상 파일명 또는 폴더 명

    FILEOP_FLAGS fFlags;// 처리 플래그

// 동일한 파일이 있을 때 메시지 박스를 화면에 보이게 하려면 지정하지 않아야 함

} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

5. 예제

6. WinExec 함수

다른 프로그램을 실행시키기 위해 사용하는 함수

1) 함수의 원형

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);

 

2) 함수의 매개 변수

- lpCmdLine: 실행하는데 필요한 명령어 입력

디렉토리명과 파일명을 모두 입력해야 하지만 만일 디렉토리 명을 입력하지 않으면 아래의 순서대로 찾음

- 프로그램 디렉토리

- 현재 프로젝트 디렉토리

- 윈도우 디렉토리

- 윈도우 시스템 디렉토리

- PATH에 설정되어 있는 디렉토리

 

- uCmdShow

SW_HIDE: 실행하면서 화면에서 숨김    

SW_SHOW: 실행 

SW_SHOWMAXIMIZED: 최대화해서 실행

SW_SHOWMINIMIZED: 최대화해서 실행

 

- 리턴 값

31이상의 정수: 정상 실행

0: 메모리나 리소스 부족

ERROR_BAD_FORMAT: 파일이 깨졌거나 포맷을 알 수 없음

ERROR_FILE_NOT_FOUND: 지정한 파일을 찾을 수 없음

ERROR_PATH_NOT_FOUND: 지정한 디렉토리를 찾을 수 없음

 

- 예제

7. CreateProcess 함수

프로그램이 제대로 실행되면 0이 아닌 값을 반환하고 실패하면 0을 반환합니다.

BOOL WINAPI CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

);

lpApplicationName: 실행할 프로그램 이름

lpCommandLine: 명령 행 인자

lpProcessAttributes: 프로세스 보호 속성 구조체

lpThreadAttributes: 스레드 보호 속성 구조체

bInheritHandles: 상속 보호 핸들 플래그

dwCreationFlags: 프로세스 생성 플래그

lpEnvironment: 프로세스가 실행될 환경 변수

lpCurrentDirectory: 현재 작업 디렉토리

lpStartupInfo: 부모 윈도우의 정보

lpProcessInformation: 프로세스 정보를 반환하기 위한 구조체의 포인터

 

실제 대부분의 인자는 사용되지 않으며 기본적인 정보만으로 수행합니다.

STARTUPINFO st;

Memset(&st,0,sizeoof(st));

St.cb = sizeoof(STARTUPINFO);

PROCESS_INFOMATION pi;

CreateProcess(NULL, notepad.exe, NULL, NULL, FALSE, 0, NULL, NULL &st, &pi);


 

예제)실행 창 만들기

8. 트레이 아이콘

작업 표시줄을 사용하지 않으면서도 아이콘 하나로 최소화하여 프로세스가 실행 중임을 표시할 수 있는 아이콘

1) Shell_NotifyIcon

아이콘을 트레이에 등록하는 함수로 원형은 아래와 같습니다.

원형

BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpdata);

dwMessage: 수행 할 동작

NIM_ADD        : 트레이이 아이콘 등록

NIM_DELETE     : 아이콘 해제

NIM_MODIFY     : 아이콘 변경

NIM_SETFOCUS   : 아이콘이 선택되도록 포커스를 부여

NIM_SETVERSION : 쉘 버전에 맞추어 동작

 

PNOTIFYICONDATA 구조체의 주요 멤버

DWORD cbSize   : 메모리 크기

HWND hWnd      : 트레이에 메시지가 전달되는 경우 받을 윈도우 핸드

UINT uID       : 아이콘의 리소스 ID

UINT uFlags    : 멤버의 유효한 값을 명시

UINT uCallbackMessage: 윈도우로 전달할 메시지

HICON hIcon    : 트레이에 등록할 아이콘 핸들

TCHAR szTip    : 트레이 아이콘 위에 마우스를 올려 놓았을 때보여질 문자열

 

예제) 트레이 아이콘을 등록하고 해제

시스템 정보

1. 시스템 정보

시스템 정보의 종류는 크게 CPU, 메모리, 키보드, 마우스와 같은 물리적인 정보와 해상도, 색상 수, 운영체제의 버전 등과 같은 환경 설정 관련 정보로 구분할 수 있습니다.

1) 시스템 정보를 구해주는 함수

GetComputerNameEx()

NetBIOS 또는 DNS 이름을 리턴

SetComputerNameEx()

이름 변경

GetUserName()

시스템 사용자의 이름을 리턴

GetWindowsDirectory()

윈도우가 설치된 디렉토리 경로 리턴

GetSystemDirectory()

시스템 디렉토리 경로 리턴

ExpandEnvironmentStrings()

지정된 환경 변수의 값을 리턴

 

BOOL GetComputerNameEx(COMPUTER_NAME_FORMAT NameType, LPTSTR lpBuffer,

LPDWORD lpnSize );

 

CString str;

DWORD x = 50;

GetComputerNameEx(ComputerNameNetBIOS, str.GetBuffer(MAX_PATH), &x);

AfxMessageBox(str);

 


 

2) GetVersionEx()

운영체제의 버전을 구해주는 함수

- 함수의 원형

BOOL GetVersionEx(  LPOSVERSIONINFO lpVersionInfo);

- OSVERSIONINFOEX 구조체

typedef struct _OSVERSIONINFOEX {
  DWORD dwOSVersionInfoSize;
  DWORD dwMajorVersion;
  DWORD dwMinorVersion;
  DWORD dwBuildNumber;
  DWORD dwPlatformId;
  TCHAR szCSDVersion[128];
  WORD wServicePackMajor;
  WORD wServicePackMinor;
  WORD wSuiteMask;
  BYTE wProductType;
  BYTE wReserved;

} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;

 

3)GetSystemInfo()

시스템 하드웨어 정보를 리턴 시켜주는 함수

- 함수의 원형

void GetSystemInfo(

  LPSYSTEM_INFO lpSystemInfo

);

SystemInfo 구조체 이용

 

4)GetKeyboardType()

키보드의 정보를 구해주는 함수

 

5)GlobalMemoryStatusEx()

시스템에 설치된 물리적 메모리와 가상 메모리 정보등을 구해주는 함수

 

6) GetSystemMetrics()

시스템 정보를 반환하는 함수


'C & C++ > C & C++' 카테고리의 다른 글

[MFC] 프로세스 간의 통신  (0) 2011.04.25
[MFC] Thread  (0) 2011.04.25
[MFC] DLL( Dynamic Linking Library)  (0) 2011.04.25
[MFC] 파일 입출력  (0) 2011.04.25
[MFC] 대화 상자  (0) 2011.04.25

댓글