애플리케이션 시작(ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

애플리케이션에서 파일 개체를 찾은 후 다음 단계는 종종 어떤 식으로든 작업을 수행하는 것입니다. instance 경우 애플리케이션은 사용자가 데이터 파일을 수정할 수 있는 다른 애플리케이션을 시작할 수 있습니다. 관심 있는 파일이 실행 파일인 경우 애플리케이션에서 실행하기만 하면 됩니다. 이 문서에서는 ShellExecute 또는 ShellExecuteEx 를 사용하여 이러한 작업을 수행하는 방법을 설명합니다.

ShellExecute 및 ShellExecuteEx 사용

ShellExecute 또는 ShellExecuteEx를 사용하려면 애플리케이션에서 작업할 파일 또는 폴더 개체와 작업을 지정하는 동사를 지정해야 합니다. ShellExecute의 경우 적절한 매개 변수에 이러한 값을 할당합니다. ShellExecuteEx의 경우 SHELLEXECUTEINFO 구조체의 적절한 멤버를 입력합니다. 두 함수의 동작을 미세 조정하는 데 사용할 수 있는 다른 여러 멤버 또는 매개 변수도 있습니다.

파일 및 폴더 개체는 파일 시스템 또는 가상 개체의 일부일 수 있으며 PIDL(항목 식별자 목록)에 대한 경로 또는 포인터로 식별할 수 있습니다.

개체 동사

개체에 사용할 수 있는 동사는 기본적으로 개체의 바로 가기 메뉴에서 찾을 수 있는 항목입니다. 사용할 수 있는 동사를 찾으려면 아래의 레지스트리를 확인합니다.

\ HKEY_CLASSES_ROOT Clsid\{object_clsid}\셸을\동사

여기서 object_clsid 개체의 CLSID(클래스 식별자)이고 동사는 사용 가능한 동사의 이름입니다. 동사\명령 하위 키에는 동사가 호출될 때 발생하는 일을 나타내는 데이터가 포함됩니다.

미리 정의된 Shell 개체에 사용할 수 있는 동사를 확인하려면 아래의 레지스트리를 참조하세요.

\ HKEY_CLASSES_ROOT Object_name\셸을\동사

여기서 object_name 미리 정의된 Shell 개체의 이름입니다. 다시 말하지만 동사\명령 하위 키에는 해당 동사가 호출될 때 발생하는 일을 나타내는 데이터가 포함됩니다.

일반적으로 사용 가능한 동사는 다음과 같습니다.

동사 Description
편집 편집기를 시작하고 편집할 문서를 엽니다.
찾기 지정된 디렉터리에서 시작하여 검색을 시작합니다.
열기 애플리케이션을 시작합니다. 이 파일이 실행 파일이 아니면 연결된 애플리케이션이 시작됩니다.
print 문서 파일을 인쇄합니다.
properties 개체의 속성을 표시합니다.
실행 계정 관리자 권한으로 애플리케이션을 시작합니다. UAC(사용자 계정 컨트롤)는 관리자 권한으로 애플리케이션을 실행하는 데 동의하라는 메시지를 표시하거나 애플리케이션을 실행하는 데 사용되는 관리자 계정의 자격 증명을 입력합니다.

각 동사는 콘솔 창에서 애플리케이션을 시작하는 데 사용되는 명령에 해당합니다. 일반적으로 지원되므로 열려 있는 동사가 좋은 예입니다. .exe 파일의 경우 열기 가 애플리케이션을 시작합니다. 그러나 특정 파일에서 작동하는 애플리케이션을 시작하는 데 더 일반적으로 사용됩니다. instance 경우 Microsoft WordPad에서 .txt 파일을 열 수 있습니다. 따라서 .txt 파일의 열린 동사는 다음 명령과 같습니다.

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"

ShellExecute 또는 ShellExecuteEx를 사용하여 .txt 파일을 열면 지정된 파일을 인수로 사용하여 Wordpad.exe 시작됩니다. 일부 명령에는 애플리케이션을 올바르게 시작하는 데 필요에 따라 추가할 수 있는 플래그와 같은 추가 인수가 있을 수 있습니다. 바로 가기 메뉴 및 동사에 대한 자세한 내용은 바로 가기 메뉴 확장을 참조하세요.

일반적으로 특정 파일에 사용 가능한 동사 목록을 확인하는 것은 다소 복잡합니다. 대부분의 경우 lpVerb 매개 변수를 NULL로 설정하면 파일 형식에 대한 기본 명령을 호출할 수 있습니다. 이 절차는 일반적으로 lpVerb 을 "열기"로 설정하는 것과 동일하지만 일부 파일 형식에는 다른 기본 명령이 있을 수 있습니다. 자세한 내용은 바로 가기 메뉴 확장ShellExecuteEx 참조 설명서를 참조하세요.

ShellExecuteEx를 사용하여 사이트에서 활성화 서비스 제공

사이트 체인의 서비스는 항목 활성화의 많은 동작을 제어할 수 있습니다. Windows 8 기준으로 ShellExecuteEx에 사이트 체인에 대한 포인터를 제공하여 이러한 동작을 사용하도록 설정할 수 있습니다. ShellExecuteEx에 사이트를 제공하려면 다음을 수행합니다.

ShellExecute를 사용하여 검색 대화 상자 시작

사용자가 Windows Explorer 폴더 아이콘을 마우스 오른쪽 단추로 클릭하면 메뉴 항목 중 하나가 "검색"입니다. 해당 항목을 선택하면 Shell에서 Search 유틸리티를 시작합니다. 이 유틸리티는 지정된 텍스트 문자열에 대한 파일을 검색하는 데 사용할 수 있는 대화 상자를 표시합니다. 애플리케이션은 lpVerb 매개 변수로 "find"를 사용하고 디렉터리 경로를 lpFile 매개 변수로 사용하여 ShellExecute를 호출하여 디렉터리에 대한 Search 유틸리티를 프로그래밍 방식으로 시작할 수 있습니다. instance 경우 다음 코드 줄은 c:\MyPrograms 디렉터리에 대한 Search 유틸리티를 시작합니다.

ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);

ShellExecuteEx를 사용하는 방법의 간단한 예제

다음 샘플 콘솔 애플리케이션은 ShellExecuteEx의 사용을 보여 줍니다. 명확성을 위해 대부분의 오류 검사 코드가 생략되었습니다.

#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>

main()
{
    LPITEMIDLIST pidlWinFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfWinFiles = NULL;
    IShellFolder *psfDeskTop = NULL;
    LPENUMIDLIST ppenum = NULL;
    STRRET strDispName;
    TCHAR pszParseName[MAX_PATH];
    ULONG celtFetched;
    SHELLEXECUTEINFO ShExecInfo;
    HRESULT hr;
    BOOL fBitmap = FALSE;

    hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
    hr = psfDeskTop->Release();

    hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
        CoTaskMemFree(pidlItems);
        if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
        {
            fBitmap = TRUE;
            break;
        }
    }

    ppenum->Release();

    if(fBitmap)
    {
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = NULL;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = pszParseName;
        ShExecInfo.lpParameters = NULL;
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_MAXIMIZE;
        ShExecInfo.hInstApp = NULL;

        ShellExecuteEx(&ShExecInfo);
    }

    CoTaskMemFree(pidlWinFiles);
    psfWinFiles->Release();

    return 0;
}

애플리케이션은 먼저 Windows 디렉터리의 PIDL을 검색하고 첫 번째 .bmp 파일을 찾을 때까지 해당 내용을 열거합니다. 이전 예제와 달리 IShellFolder::GetDisplayNameOf 는 표시 이름 대신 파일의 구문 분석 이름을 검색하는 데 사용됩니다. 파일 시스템 폴더이므로 구문 분석 이름은 ShellExecuteEx에 필요한 정규화된 경로입니다.

첫 번째 .bmp 파일이 있으면 SHELLEXECUTEINFO 구조체의 멤버에 적절한 값이 할당됩니다. lpFile 멤버는 파일의 구문 분석 이름으로 설정되고 lpVerb 멤버는 NULL로 설정되어 기본 작업을 시작합니다. 이 경우 기본 작업은 "열기"입니다. 그런 다음 구조체가 ShellExecuteEx에 전달되어 일반적으로 MSPaint.exe 비트맵 파일에 대한 기본 처리기를 실행하여 파일을 엽니다. 함수가 반환되면 PIDL이 해제되고 Windows 폴더의 IShellFolder 인터페이스가 해제됩니다.