いつもお世話になります。 VS2005・コンソールで開発しています。
そこで疑問があります。今 実行exeと同じディレクトリに iniファイルから値を読み
取る処理をしています。このとき以下のようにソースを書きました。
#include <iostream>
using namespace std;
#define INIFILE .\abc.ini // exe と同ディレクトリのiniファイルのパス
int func1( )
{
WIN32_FIND_DATA lp;
// ファイル確認
HANDLE hWnd = FindFirstFile(INIFILE , &lp); ・・・(1)
if( hWnd != INVALID_HANDLE_VALUE)
cout << File Exist << endl; // ファイルあり
else
cout << Not File Exist << endl; // ファイルなし
return 0;
}
このとき(1)の箇所において ブレークポイントを設定してデバッグすると正常にハ
ンドルを取得できるのですが、実際にExe(デバッグ版)だけを実行させると正常取得で
きませんでした。 #define の代わりに GetModuleFileName()を用いて iniファイルを
指定すると当然ながら両方の場合でうまくいきました。
そこで疑問なのですが 私が定義した define では何かいけないのでしょうか?それ
とも デバッグしながらとExe単体で実行させた場合と何か違いあるのでしょうか??も
しご存知方がいっらしゃいましたら、ご教授お願いいたします。
> #define INIFILE .\abc.ini // exe と同ディレクトリのiniファイルのパス
.\\abc.iniですよね?
読めているようなので掲示板へ書き込むときのコピペミスかなにかでしょうけど。
とりあえず、成功するパターンと失敗するパターンそれぞれで
FindFirstFile()する前にGetCurrentDirectory()で
カレントディレクトリがどうなっているか確認されてはどうでしょうか?
相対パス表記なのでカレントディレクトリが違えば当然結果も異なります。
# あと、FindFirstFile()はウィンドウハンドルは返しませんので
# 変数名は変更した方がいいと思います。
瀬戸っぷさんのおっしゃるとおり、
IDE上でデバッグするときのカレントディレクトリと、
EXE単体で実行するときのカレントディレクトリを確認してみてください。
似たようなスレ↓
[MSDNフォーラム]コマンドラインから作成したEXEとVisual StudioからビルドしたEXEの
違い
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=621037&SiteID=7
瀬戸っぷさん。Blueさん。ありがとうございます。
>.\\abc.iniですよね?
そうです。間違えてました。
>カレントディレクトリがどうなっているか確認されてはどうでしょうか?
今回は FindFirstFile( )の直前で GetModuleFileName()で exeのディレクトリを
coutで表示させたのですが 両方の場合で同じディレクトリパスをさしていました。
一度 GetCurrentDirectory()で調べてみます。
> 今回は FindFirstFile( )の直前で GetModuleFileName()で exeのディレクトリを
> coutで表示させたのですが 両方の場合で同じディレクトリパスをさしていました。
実行ファイルの位置と、カレントディレクトリの位置は違いますよ。
たぶん、プロジェクトのプロパティから「デバッグ」→「作業用ディレクトリ」
を
「$(SolutionDir)$(ConfigurationName)」
にでもすれば、カレントが実行時と同じになるんじゃないかな。(未確認)
どーも、PATIOです。
> 実行ファイルの位置と、カレントディレクトリの位置は違いますよ。
Windowsのプログラミング上、上記の認識は大切です。
特にカレントディレクトリはWindows上ではかなりわかりにくくなってますし。
ショートカットで起動している場合は、ショートカット上の設定でも変わりますので
注意が必要です。
基本的にはカレントディレクトリと言うのはあてにならない場合が多いので
GetModuleFileName()で得られる実行ファイルがある場所と同じディレクトリを
採用する事が多いです。
えっと、何を何に「採用」するんでしょうか?
それはとりあえずおいといて:
元発言者様
設定ならユーザ別にできるようレジストリに置くべきでしょう。
海より深い理由があってレジストリを使わない選択をしたのであれば
設定ファイルをユーザ別にもてるようにすべき。
その辺のガイドライン文書ってどこにあったかなぁ...
> えっと、何を何に「採用」するんでしょうか?
すいません、舌足らずでした。
実行ファイルの置き場所をアプリの設定ファイルとか動作環境ファイルの置き場所を
指定するときの基準ディレクトリに採用する事が多いです。
カレントディレクトリを基準にしてしまうと起動時の起動方法によって
カレントディレクトリの位置がまちまちになってしまうからと言うのが理由です。
特定の位置を想定できないので使い勝手がよく無いと言うことです。
> 設定ならユーザ別にできるようレジストリに置くべきでしょう。
> 海より深い理由があってレジストリを使わない選択をしたのであれば
> 設定ファイルをユーザ別にもてるようにすべき。
> その辺のガイドライン文書ってどこにあったかなぁ...
ガイドライン的な文章と言うのは私も心当たりが無いですね。
あったら教えてもらえると嬉しいです。
多分、レジストリに置くのが一番楽でしょうね。
OS側で切り替えてくれますし。
逆にユーザー毎に変えたくないという仕様なのであれば、
それはそれで有りなのでしょうけれど。
Blue さん。tetrapod さん。 PATIO さん。ありがとうございます。
GetCurrentDirectory()で調べたところ IDE環境では プロジェクトのディレクトリ
のパスになっており 実行ExeではExeがある箇所のディレクトリのパスになってまし
た。 Exeの出力先パスを変更してましたので #define で定義したときの相対パスが違
っていたみたいです。
みなさん。ありがとうございました。 また何かあればよろしくお願いいたします