#include <Shlobj.h>
WCHAR wchSpecialPath[MAX_PATH];
SHGetSpecialFolderPath(NULL, wchSpecialPath, CSIDL_LOCAL_APPDATA, FALSE);
CSIDL_LOCAL_APPDATA // C:\\Users\\XXX\\Appdata\\Local
CSIDL_PROGRAM_FILES // C:\\Program Files
CSIDL_WINDOWS // C:\\Windows
CSIDL_SYSTEM // C:\\Windows\\System32
특수한 디렉토리 경로를 구할 때 유용하다.
memset(wchLocalPath, 0, MAX_PATH * sizeof(WCHAR));
GetModuleFileName(NULL, wchLocalPath, MAX_PATH);
현재 실행 파일의 경로를 구해줍니다. 원래 알고 있었는데, 굳이 적는 이유는 예를 들어 GetCurrentDirectory 함수로 현재 작업 중인 디렉토리 경로를 구할 때가 있는데, 만약 로컬 서비스에서 저 함수를 사용하면 시스템 사용자 경로가 나오겠죠.
memset(wchLocalPath, 0, MAX_PATH * sizeof(WCHAR));
GetModuleFileName(NULL, wchLocalPath, MAX_PATH);
PathRemoveFileSpec(wchLocalPath);
이렇게 하면 시스템 경로가 아니라 모듈 현재 경로의 실제 작업 경로를 알아낼 수 있습니다.
CreateProcess(
wchLocalPath,
wchArguments,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&StartupInfo,
&ProcessInfo
);
만약 만들어진 경로로 프로세스를 실행할 경우, 첫 번째 인자로 절대 경로를 주면 실행이 잘 되겠지만 상대 경로는 문제가 생길 수 있습니다. 이 때 첫 번째 인자는 NULL로 주고, CmdLine에 "상대경로 인자1 인자2 인자3" 이렇게 주고 실행하면 된다고 합니다. 확인은 안해봤는데, 이것도 문제가 있을 수 있습니다. 만약 작업 중인 경로가 시스템 경로면 시스템 경로에서 상대 경로에 있는 바이너리를 찾을텐데, 이 경우에는 또 어떻게 처리를 해야할지... 아무튼 경로 문제로 스트레스 받아서 정리해봅니다.
댓글 없음:
댓글 쓰기