转自:http://blog.csdn.net/kzh313561014/article/details/6630643
GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目录
GetCurrentDirectory()适用于XP等系统,在WinCE上不能使用
GetModuleFileName()适用于WinCE2.0以后
使用方法:
//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
}
GetModuleFileName函数
WINAPI DWORD GetModuleFileName( HMODULE hModule, LPWSTR lpFilename, DWORD nSize ); GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾),则GetBuffer参数应至少 为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大于文件长度时,ReleaseBuffer参数一定要为文件长度(如果 GetBuffer参数为文件长度的话不存在问题,ReleaseBuffer参数可以为默认-1)! GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间, 即使里面最终保存的字符串长度小于申请的空间长度, 也不会将 多余空间释放.
__________________________________________________________________________________________________________________
DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer );
The GetCurrentDirectory function retrieves the current directory for the current process.
GetCurrentDirectory返回当前进程的当前目录,并不一定返回你的应用程序的目录。如果你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了当前进程的当前目录了。
Parameters nBufferLength: 接收保存路径的字符串缓存长度, 缓存必须有一个保存结束的空字符的位置. lpBuffer:指向接收字符串的缓存,收到的非空字符串指定了当前目录的绝对路径. DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); GetModuleFileName 函数指定当前进程模块的路径.它仅仅操作当前进程下的模块.如果想获取其他进程下的模块信息, 则需使用 GetModuleFileNameEx 函数.
Parameters hModule:模块的句柄,或者设置为NULL表示当前模块。 lpFilename:保存路径的缓冲区。 nSize:缓冲区的大小。 例子:
TCHAR strExePath[_MAX_PATH]; GetModuleFileName(NULL,strExePath,_MAX_PATH);
PathRemoveFileSpec(strExePath);
如果当前执行程序的位置为c:\test.exe,GetModuleFileName获取的strExePath即为c:\test.ext,通过去掉名称函数最终获得的strExePath为c:。(注意PathRemoveFileSpec 系统API函数调用时必须包含#include "Shlwapi.h"作为头文件)
TCHAR strExePath[_MAX_PATH]; GetCurrentDirectory(_MAX_PATH, strExePath);
获取当前的系统目录,可能是c:也可能是其他值。