[Windows API] ShellExecute

hyeonju_jo·2024년 1월 10일

Windows

목록 보기
1/1

ShellExecute 함수는 Windows API로, Microsoft Windows 운영체제에서 외부 프로그램 또는 파일을 실행하는 데 사용되는 함수

  • 함수는 주어진 파일을 실행하는 데 필요한 프로그램을 찾아서 실행하거나, 웹 페이지를 열고 특정 URL을 브라우저로 연결하는 데 사용된다.

ShellExecute 함수 원형

HINSTANCE ShellExecute(
  HWND hwnd,
  LPCTSTR lpOperation,
  LPCTSTR lpFile,
  LPCTSTR lpParameters,
  LPCTSTR lpDirectory,
  INT nShowCmd
);

ShellExecute의 주요 기능

파일 열기

  • 사용자의 시스템에 연결된 기본 프로그램을 사용하여 파일을 연다.
  • 예를 들어, PDF 파일을 열 경우 기본 PDF 뷰어가 실행된다.

URL 열기

  • 기본 웹 브라우저에서 URL을 연다.

프로그램 실행

  • 특정 프로그램을 실행한다.

시스템 명령 수행

  • 'explore', 'find', 'print'와 같은 명령을 수행하여 파일 탐색기를 열거나, 파일을 검색하거나, 문서를 인쇄할 수 있다.

ShellExecute Parameter

ShellExecute는 다양한 파라미터를 받을 수 있으며, 이 파라미터들은 함수의 동작 방식을 결정한다.

1. hwnd

  • 실행된 프로그램의 부모 윈도우 핸들
  • 인자를 사용하면 실행된 프로그램이 모달 대화 상자와 같은 모달 윈도우로 표시될 때 부모 윈도우를 지정할 수 있다.
  • 일반적으로 NULL 값을 사용하거나 부모 윈도우의 핸들을 전달한다.
  • 윈도우 핸들은 '0' 이다.

2. lpOperation

  • 실행할 작업을 나타내는 문자열
  • 주요 작업으로 "open"이나 "print"을 사용한다.
  • "open"은 파일을 실행하는 작업을 의미하고, "print"는 파일을 인쇄하는 작업을 의미 한다.
  • NULL을 지정하면 파일의 기본 동작(대부분 "open")이 수행된다.

3. lpFile

  • 실행할 파일의 경로 또는 실행할 프로그램의 이름

4. lpParameters

  • 실행될(lpFile에 지정된) 프로그램에 전달할 추가 매개변수

5. lpDirectory

  • 실행될 프로그램의 기본 작업 디렉토리
  • 실행될 프로그램의 작업 디렉토리를 지정할 수 있다.

6. nShowCmd

  • 실행될 프로그램의 창을 어떻게 표시할지를 지정하는 정수
  • 주요 값으로 SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED 등이 있다.

ShellExecute 예시

Delphi

uses
  ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', 'C:\example.txt', nil, nil, SW_SHOWNORMAL);
end;

C++

#include <windows.h>

int main() {
    ShellExecute(NULL, "open", "http://www.example.com", NULL, NULL, SW_SHOWNORMAL);
    return 0;
}

반환 값

  • ShellExecuteHINSTANCE를 반환한다.
  • 값이 32보다 크면 성공, 그렇지 않으면 오류를 나타낸다.
  • 오류 코드를 얻으려면 GetLastError 함수를 사용할 수 있습니다.

HINSTANCE

  • HINSTANCE는 Windows 프로그래밍에서 사용되는 핸들 타입
  • ShellExecute 함수에서 반환되는 HINSTANCE 값은 호출된 작업의 성공 여부 및 관련 정보를 나타내는 데 사용된다.

HINSTANCE의 의미

성공여부

ShellExecute가 성공적으로 수행되었다면, 반환되는 HINSTANCE 값은 32보다 크다.
이 경우, HINSTANCE는 실행된 프로그램이나 문서의 인스턴스 핸들을 의미합니다.

오류코드

  • 만약 반환된 값이 32 이하라면, 이는 오류를 나타낸다.
코드설명
ERROR_FILE_NOT_FOUND2지정된 파일을 찾을 수 없습니다.
ERROR_PATH_NOT_FOUND3지정된 경로를 찾을 수 없습니다.
ERROR_BAD_FORMAT11실행 파일이 손상되었거나 유효하지 않은 실행파일 입니다.
SE_ERR_ACCESSDENIED5지정된 파일에 대한 접근이 거부되었습니 다.
SE_ERR_ASSOCINCOMPLETE27파일 연결이 완전하지 않습니다.
SE_ERR_DDEBUSY30DDE 트랜잭션이 다른 것에 의해 사용 중 입니다.
SE_ERR_DDEFAIL29DDE 트랜잭션이 실패했습니다.
SE_ERR_DDETIMEOUT28DDE 트랜잭션에 요청 시간이 초과되었습 니다.
SE_ERR_NOASSOC31주어진 파일 이름 확장명에 연결된 응용 프로그램이 없습니다.
SE_ERR_SHARE26공유 위반 오류가 발생했습니다.

HINSTANCE 사용 예제

Delphi

uses
  ShellAPI;

procedure OpenURL;
var
  H: HINST;
begin
  H := ShellExecute(0, 'open', 'http://www.example.com', nil, nil, SW_SHOWNORMAL);
  if H <= 32 then
    ShowMessage('Error opening URL');
end;

C++

#include <windows.h>
#include <shellapi.h>

int main() {
    HINSTANCE hInst = ShellExecute(NULL, "open", "http://www.example.com", NULL, NULL, SW_SHOWNORMAL);
    if ((int)hInst <= 32) {
        // 오류 처리
    }
    return 0;
}

ShellExecute 사용시 주의할 점

  • ShellExecute를 사용할 때는 보안에 특별히 주의해야한다.
  • 사용자로부터 입력받은 데이터를 이 함수에 직접 전달하는 경우, 악의적인 입력으로 인해 보안 취약점이 발생할 수 있다.
  • 따라서, 사용자 입력을 사용하여 ShellExecute를 호출할 때는 해당 입력을 철저히 검증해야 합니다.

참조

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

profile
소통과 발전을 중요시 하는 소프트웨어엔지니어

0개의 댓글