string GetExePath() //获取exe本地路径
{
//获取应用程序目录
CHAR szapipath[_MAX_PATH];//(D:\Documents\Downloads\TEST.exe)
memset(szapipath, 0, _MAX_PATH);
GetModuleFileNameA(NULL, szapipath, _MAX_PATH);
//获取应用程序名称
char szPath[_MAX_PATH] = "";//(TEST.exe)
char* pbuf = NULL;
char* szLine = strtok_s(szapipath, "\\", &pbuf);
while (NULL != szLine)
{
std::string str = szLine;
if (str.find(".exe") == str.npos)
{
strcat_s(szPath, szLine);
strcat_s(szPath, "\\");
}
szLine = strtok_s(NULL, "\\", &pbuf);
}
return szPath;
}
string GetOpenFileNameZK(void* parent,
const string& caption,
const string& dir,
const string& filter,
string* selectedFilter)
{
OPENFILENAMEA ofn;
char szOpenFileNames[80 * MAX_PATH];
char szPath[MAX_PATH];
char szFileName[80 * MAX_PATH];
char* p;
int nLen = 0;
string strSelectFiles = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szOpenFileNames;
ofn.nMaxFile = sizeof(szOpenFileNames);
ofn.lpstrFile[0] = 0;
ofn.lpstrFilter = "All Files(*.*)/0*.*/0";
if (GetOpenFileNameA(&ofn))
{
//把第一个文件名前的复制到szPath,即:
//如果只选了一个文件,就复制到最后一个'/'
//如果选了多个文件,就复制到第一个NULL字符
lstrcpynA(szPath, szOpenFileNames, ofn.nFileOffset);
//当只选了一个文件时,下面这个NULL字符是必需的.
//这里不区别对待选了一个和多个文件的情况
szPath[ofn.nFileOffset] = 0;
nLen = lstrlenA(szPath);
if (szPath[nLen - 1] != '//') //如果选了多个文件,则必须加上'//'
{
lstrcatA(szPath, "//");
}
p = szOpenFileNames + ofn.nFileOffset; //把指针移到第一个文件
ZeroMemory(szFileName, sizeof(szFileName));
while (*p)
{
lstrcatA(szFileName, szPath); //给文件名加上路径
lstrcatA(szFileName, p); //加上文件名
lstrcatA(szFileName, "/n"); //换行
p += lstrlenA(p) + 1; //移至下一个文件
}
strSelectFiles = szFileName;
//MessageBoxA(NULL, szFileName, "MultiSelect", MB_OK);
}
SetCurrentDirectoryA(GetExePath().c_str());
return strSelectFiles;
}
注意粗体部分,这里在选择文件后,程序的默认路径就变成了选择的路径,以后所有的./路径全部变成了当前选择的位置,所以需要再次设置回exe的执行目录,今天在测试程序的时候发现./目录始终写不进去文件,才发现是这个原因导致的。