使用函数GetModuleFileName就可以实现想要的功能了。
摘抄一下百度百科的东西:
获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。
DWORD WINAPIGetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
返回值:
Long,如执行成功,返回复制到lpFileName的实际字符数量;零表示失败。使用GetLastError可以打印错误信息。
一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL,
该函数返回该应用程序全路径。
指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
装载到缓冲区lpFileName的最大字符数量
使用案例如下:
wchar_tcxPath[MAX_PATH];//用来装载路径的变量,类型要是Wchar_t才可以
GetModuleFileName(NULL,cxPath,MAX_PATH);//调用函数
//从这里开始,实现wchar_t到char* 的类型转换,因为无法直接实现wchar_t到String的转换
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,cxPath,-1,NULL,0,NULL,FALSE);
char *path=new char[dwNum];
WideCharToMultiByte(CP_OEMCP,NULL,cxPath,-1,path,dwNum,NULL,FALSE);
//好转换完成
String^path_1=gcnew String(path);//char*到String的转换
//比如说,在E:\程序 的目录下有运行的程序,那么路径名就是:E:\程序 ,如果想要直接用来打开文件的话,还需要将 \ 转换为 \\,然后加上要打开的文件路径,比如想要打开E:\程序\1.txt 的话,步骤就是
E:\程序(调用函数的结果) -> E:\\程序(将 \ 转换为 \\ ) - > E:\\程序\\1.txt
//下面是实现将 \ 转换为 \\)
Int32 mark=path_1->LastIndexOf('\\');//有两个 // 是因为 / 是语义符,需要添加\来转义,具体请阅读教材上p10
path_1=path_1->Remove(mark+1,path_1->Length-mark-1);
path_1=path_1->Replace("\\","\\\\");
到这里就完成了路径的获取了。那么接下来可以加上程序中需要用到文件的路径,就不必在使用程序时将文件解压到特定的路径下了。
可以借助一款叫AdvancedInstaller 的软件将程序和文件打包,制作成安装程序。(可百度下载和看教程,比较容易上手)如此一来,就可以让用户自行选择安装路径了。
效果如下
欢迎拍砖