VS2005 VC++ MFC SDI アプリです。
ボタンを押したとき、自分と同じディレクトリにあるファイルを開くコードを書いてい
ます。
void CFushigiView::OnInitialUpdate()
{
_wgetcwd(m_wcCurPath, _MAX_PATH); // 自分のパスを取得
}
void CFushigiView::OnBnClickedBtnSearch()
{
_wchdir(m_wcCurPath); // 自分のパスに戻す
if (FindFirstFile(_T(FUSHIGI.CSV), &wfd) == INVALID_HANDLE_VALUE)
{
MessageBox(_T(見つからないよ));
}
else・・・・(ファイルを開く)
}
このアプリの実行ファイルを右クリック→「スタートメニューにアイコンを追加」で、
アイコンがスタートメニューの左上のグループ(インターネット等があるところ)に作
成されます。
このアイコンから起動すると、自分のディレクトリにあるファイルを見つけることが出
来ません。
実行ファイルまたはそのショートカットから起動すると、ちゃんと見つけます。
OSは Windows XP, Vista どちらも同じです。
右クリック→「スタートメニューにアイコンを追加」で作成されるアイコンは、エクス
プローラで探しても存在しません。どうやら仮想的なファイルのように思えます。
そして自分のディレクトリ情報を持っていないようです。
前期のコードをどのように変えたら、スタートメニューのアイコンからでも正しく動作
するようになるでしょうか?
よろしくお願いいたします。
「作業ディレクトリ」なんぞが必要になることなど、
めったにありませんね。忘れちゃってもいいでしょう。
取得すべきは
「このアプリが起動されたディレクトリ」でしょう(たぶん)。
これは、直接取れないので、アプリケーションのフルパスを
::GetModuleFileName()
で取得して、それを加工したらどうでしょう。
もしかしたら、MFCに似たようなのがあるかもしれませんが。
そのアプリケーションに必要なファイルであるなら
ショートカットで何処にでもなってしまうようなカレントディレクトリ
(ショートカットでは作業ディレクトリ)を当てにするような作りに
するべきでは無いと思います。
一般的には仲澤さんが書かれているように実行ファイルが格納されている
ディレクトリを取得してそのフォルダパスを元にフルパスでファイルを
読み込むようにするのが普通だと思います。
仲澤様、PATIO様
ありがとうございました。
出来ました。
::GetModuleFileName()を使うと、スタートメニューのアイコンからでも実行ファイルの
ディレクトリが得られました。
解決です。
ちなみに、「スタートメニューにアイコンを追加」は、どこかにショートカットを作るよ
うなものではありません。
スタートメニューのあの部分に登録されているアイコンの情報はレジストリにあり、どこ
かにあるショートカットを参照しているだけです。
そのため、登録元になったショートカットのプロパティを変更すると、スタートメニュー
に追加した方も変更されています。
その情報がレジストリのどこに保存されているかは、アイコンを追加する前と後でレジス
トリのダンプを取って比較すればわかりますが、データはバイナリ形式で、そのフォーマ
ットは明らかにされていませんので、プログラムからアイコンを追加したり削除したりす
ることはできません。
また、あのアイコンを操作するような API もありません。
これについては、敢えて明らかにしていないのであると、以下の本に書かれています。
http://www.amazon.co.jp/dp/4756150004/
> そして自分のディレクトリ情報を持っていないようです。
これは違います。
試しに _wgetcwd の結果を表示してみれば、何らかのパスが表示されるはずです。
ただ、それが、アプリケーションが置かれているフォルダと異なるために、そこで
FUSHIGI.CSV を見つけることができないというだけです。
_wgetcwd の結果(作業ディレクトリ)は、常に exe が置かれているフォルダになるわけ
ではなく、どうにでも変わり得るということを知っておいてください。