你可能想试试这个:让你的程序调用GetCurrentDirectory()
并将结果输出到某个地方,你可以确认程序的当前目录确实是你认为的那样。OutputDebugString()
如果您在调试器下运行,或者MessageBox()
不是,您可以使用。
当我需要确定我正在打开一个位于同一位置的文件时,我会调用GetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn))
以获取 EXE 文件的 FQN,去掉 EXE 文件名并添加我需要的文件名。这样,我就不会做出任何可能错误的假设——毕竟,为与包含 EXE 文件的目录不同的程序设置默认目录的快捷方式是微不足道的。
此外,如果您通过输入程序的完整路径从命令行运行程序,那么程序的当前目录就是您运行它时所在的目录,而不是找到 EXE 的目录。如果通过搜索环境变量找到您的程序也是如此PATH
(是的,它仍然存在于 Windows 中。)
这是我十多年来用来做你所描述的事情的一个例子:
char szHelpFileName[_MAX_FNAME];
char *cp;
GetModuleFileName( NULL, szHelpFileName, sizeof(szHelpFileName) );
cp = strrchr( szHelpFileName, '\\' );
if( cp )
{
cp++; // Point to the char just following the final slash.
}
else
{ // No backslash, is there a colon?
cp = strrchr( szHelpFileName, ':' );
if( cp )
{
cp++; // Point to the char just following the colon.
}
else
{ // I give up. I'll have no path information.
cp = szHelpFileName;
}
}
strcpy( cp, "program.hlp" );
最终结果是与 EXE 位于同一位置的帮助文件的名称。除非帮助文件丢失(或者它的权限被某种方式剥夺了),否则这总是有效的。我从来没有让它遵循评论说“我放弃”的“偏执狂”路径。