これを試してみてください。プログラムを呼び出しGetCurrentDirectory()
て結果をどこかに出力し、プログラムの現在のディレクトリが本当にあなたが考えているものであることを確認できるようにします。OutputDebugString()
デバッガーで実行している場合でも、そうでない場合でも使用できますMessageBox()
。
同じ場所にあるファイルを開いていることを確認する必要がある場合は、 を呼び出しGetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn))
て EXE ファイルの FQN を取得し、EXE ファイル名を削除して、必要なファイルの名前を追加します。このように、間違っている可能性のある仮定を行っているわけではありません。結局のところ、EXE ファイルを含むディレクトリとは異なるプログラムの既定のディレクトリをショートカットに設定することは簡単なことです。
また、プログラムへのフル パスを入力してコマンド ラインからプログラムを実行する場合、プログラムの現在のディレクトリは、EXE が見つかったディレクトリではなく、実行したときのディレクトリになります。PATH
これは、環境変数を検索してプログラムが見つかった場合にも当てはまります (はい、Windows にはまだ存在します)。
あなたが説明したことを行うために私が10年以上使用してきたものの例を次に示します。
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 と同じ場所にあるヘルプ ファイルの名前です。ヘルプ ファイルが見つからない (またはそのアクセス許可が何らかの形で無効になっている) 場合を除き、これは常に機能します。コメントが「あきらめる」と言う「パラノイア」の道をたどったことは一度もありません。