less than 1 minute read

파티션을 나눠서 응용 프로그램들을 D 드라이브에 설치하는데, 프로그램 파일 패스가 “C:\Program Files”로 세팅되어 있어서 설치할 때마다 Home –> Del -> D 콤보로 드라이브 명을 바꿔서 설치했다. 웹 서핑하던 중에 레지스트리를 수정해 프로그램 파일 패스를 변경하는 방법을 찾아서 귀찮음을 덜 수 있었다.

nil

그림과 같이 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion] 키에 있는 ProgramFilesDir의 문자열을 수정하면 된다. 하지만, 하드 코딩으로 설치 경로를 지정해 놓으면 답이 없다. 응용 프로그램에서 설치는 첫인상인데, 이러면 첫인상 꽝인 거지.

WinAPI로 응용 프로그램 기본 설치 경로를 얻는 방법은 다음과 같다.

#pragma comment(lib,"shell32")

#include <shlobj.h>
#include <iostream>

int main()
{
    char path[MAX_PATH];
    HRESULT hr = SHGetFolderPathA(
        NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, path);
    if (FAILED(hr))     return 1;

    std::cout << "Program Files Directory : " << path << std::endl;

    return 0;
}

nil

프로그램 파일 경로뿐만 아니라 내 문서, 내 그림 등 특수 폴더의 경로를 가져올 수 있는데, 그때 사용하는 CSIDL은 CSIDL-MSDN에서 확인할 수 있다.

CSIDL(constant special item ID list)를 사용해서 폴더 패스를 가져오는 SHGetFolderPath같은 함수들은 Deprecated 됐다. 언제 없어질지 모른다는 뜻이라서 대체된 KNOWNFOLDERID를 사용하는 SHGetKnownFolderPath 함수로 폴더 패스를 가져오려고 했는데, 이게 Vista 이상에서만 동작하네…