defineのパス指定 – プログラミング – Home

通知
すべてクリア

[解決済] defineのパス指定


ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 いつもお世話になります。 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単体で実行させた場合と何か違いあるのでしょうか??も
しご存知方がいっらしゃいましたら、ご教授お願いいたします。


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> #define INIFILE .\abc.ini // exe と同ディレクトリのiniファイルのパス

.\\abc.iniですよね?
読めているようなので掲示板へ書き込むときのコピペミスかなにかでしょうけど。

とりあえず、成功するパターンと失敗するパターンそれぞれで
FindFirstFile()する前にGetCurrentDirectory()で
カレントディレクトリがどうなっているか確認されてはどうでしょうか?
相対パス表記なのでカレントディレクトリが違えば当然結果も異なります。

# あと、FindFirstFile()はウィンドウハンドルは返しませんので
# 変数名は変更した方がいいと思います。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

瀬戸っぷさんのおっしゃるとおり、
IDE上でデバッグするときのカレントディレクトリと、
EXE単体で実行するときのカレントディレクトリを確認してみてください。

似たようなスレ↓
[MSDNフォーラム]コマンドラインから作成したEXEとVisual StudioからビルドしたEXEの
違い
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=621037&SiteID=7


返信引用
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

瀬戸っぷさん。Blueさん。ありがとうございます。

>.\\abc.iniですよね?
そうです。間違えてました。

>カレントディレクトリがどうなっているか確認されてはどうでしょうか?
 今回は FindFirstFile( )の直前で GetModuleFileName()で exeのディレクトリを
coutで表示させたのですが 両方の場合で同じディレクトリパスをさしていました。
 一度 GetCurrentDirectory()で調べてみます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 今回は FindFirstFile( )の直前で GetModuleFileName()で exeのディレクトリを
> coutで表示させたのですが 両方の場合で同じディレクトリパスをさしていました。
実行ファイルの位置と、カレントディレクトリの位置は違いますよ。

たぶん、プロジェクトのプロパティから「デバッグ」→「作業用ディレクトリ」

「$(SolutionDir)$(ConfigurationName)」

にでもすれば、カレントが実行時と同じになるんじゃないかな。(未確認)


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

どーも、PATIOです。

> 実行ファイルの位置と、カレントディレクトリの位置は違いますよ。
Windowsのプログラミング上、上記の認識は大切です。
特にカレントディレクトリはWindows上ではかなりわかりにくくなってますし。
ショートカットで起動している場合は、ショートカット上の設定でも変わりますので
注意が必要です。
基本的にはカレントディレクトリと言うのはあてにならない場合が多いので
GetModuleFileName()で得られる実行ファイルがある場所と同じディレクトリを
採用する事が多いです。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

えっと、何を何に「採用」するんでしょうか?

それはとりあえずおいといて:

元発言者様
設定ならユーザ別にできるようレジストリに置くべきでしょう。
海より深い理由があってレジストリを使わない選択をしたのであれば
設定ファイルをユーザ別にもてるようにすべき。
その辺のガイドライン文書ってどこにあったかなぁ...


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> えっと、何を何に「採用」するんでしょうか?

すいません、舌足らずでした。
実行ファイルの置き場所をアプリの設定ファイルとか動作環境ファイルの置き場所を
指定するときの基準ディレクトリに採用する事が多いです。
カレントディレクトリを基準にしてしまうと起動時の起動方法によって
カレントディレクトリの位置がまちまちになってしまうからと言うのが理由です。
特定の位置を想定できないので使い勝手がよく無いと言うことです。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> 設定ならユーザ別にできるようレジストリに置くべきでしょう。
> 海より深い理由があってレジストリを使わない選択をしたのであれば
> 設定ファイルをユーザ別にもてるようにすべき。
> その辺のガイドライン文書ってどこにあったかなぁ...

ガイドライン的な文章と言うのは私も心当たりが無いですね。
あったら教えてもらえると嬉しいです。
多分、レジストリに置くのが一番楽でしょうね。
OS側で切り替えてくれますし。
逆にユーザー毎に変えたくないという仕様なのであれば、
それはそれで有りなのでしょうけれど。


返信引用
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

Blue さん。tetrapod さん。 PATIO さん。ありがとうございます。
 GetCurrentDirectory()で調べたところ IDE環境では プロジェクトのディレクトリ
のパスになっており 実行ExeではExeがある箇所のディレクトリのパスになってまし
た。 Exeの出力先パスを変更してましたので #define で定義したときの相対パスが違
っていたみたいです。
 みなさん。ありがとうございました。 また何かあればよろしくお願いいたします


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました