끝나지 않는 프로그래밍 일기

[API 탐방]


자신의 위치를 얻어오는

GetCurrentDirectory, GetModuleFileName




실행중인 파일의 현재 작업 디렉토리를 얻어오는 GetCurrentDirectory API부터 알아보도록 하겠습니다. 아래는 GetCurrentDirectory API 함수의 원형입니다.

DWORD WINAPI GetCurrentDirectory(DWORD nBufferLength, LPTSTR IpBuffer)

첫번째 인수를 살펴보면 현재 작업 디렉토리의 경로가 들어갈 버퍼의 길이, 두번째 인수로는 현재 작업 디렉토리 경로를 받을 포인터가 옵니다. 반환값으로는 성공시, 작업 디렉토리 경로의 문자열 길이를 반환하며, 버퍼값이 모자랄경우 버퍼값이 반환됩니다. 실패시 0이 반환됩니다.


한번, GetCurrentDirectory 함수를 통해 현재 작업 디렉토리를 화면에 출력해보도록 합시다.

#include <stdio.h>
#include <windows.h>

int main()
{
	char Path[MAX_PATH];
	GetCurrentDirectory(MAX_PATH, Path);

	printf("%s\n", Path);
	return 0;
}

결과:

C:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Co
nsoleApplication4
계속하려면 아무 키나 누르십시오 . . .


코드의 6행을 보시면, MAX_PATH란 매크로 상수가 쓰였는데, 경로의 길이는 260으로 제한되어 있습니다. 이 MAX_PATH 매크로 상수는 windows.h를 포함하면 사용할 수 있습니다. 길이 MAX_PATH인 char형 배열을 만들어 놓고, 7행에서 Path에 현재 작업 디렉토리의 경로를 넣습니다. 그런 뒤에 Path를 출력하면, 현재 작업 디렉토리의 경로가 출력되게 됩니다.


이번엔 GetModuleFileName API에 대해 간단히 보도록 합시다. 아래는 GetModuleFileName API 함수의 원형입니다.

DWORD WINAPI GetModuleFileName(HMODULE hModule, LPSTR IpFileName, DWORD nSize)

첫번째 인수를 살펴보면, 현재 실행되고 있는 모듈의 핸들 또는 NULL이 옵니다. 만약 첫번째 인수로 NULL이 온다면, 자신의 실행 경로를 반환합니다. 두번째 인수는 자신의 실행 경로를 받을 포인터가, 세번째 인수로는 자신의 실행 경로가 들어갈 버퍼의 길이를 말합니다.


GetModuleFileName API 함수를 통해, 자신의 실행 경로를 받아와보도록 합시다.

#include <stdio.h>
#include <windows.h>

int main()
{
	char Path[MAX_PATH];
	GetModuleFileName(NULL, Path, MAX_PATH);

	printf("%s\n", Path);
	return 0;
}

결과:

C:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\De
bug\ConsoleApplication4.exe
계속하려면 아무 키나 누르십시오 . . .


코드에서 7행을 보시면, 첫번째 인수를 NULL로 준 덕분에, Path에 자신의 실행 경로가 들어갑니다. 출력해보면, 실행 경로가 출력됨을 확인하실 수 있습니다.