ファイルをダブルクリックして開くことができません

[戻る]
はまち 2002/05/27(月) 19:18:49
////////////////////////////////////////////////////////////////////////////////
    
    開発環境 : Visual C++ 6.0 Service Pack 3
    動作環境 : Windows 98 Second Edition
    MFC使用 MDIベース

////////////////////////////////////////////////////////////////////////////////
AppWizardで基本的なMDIベースのプログラムを作った後、シリアル化を実装して「名前を付け
て保存」をすることができるようになったのですが、このできたファイルをダブルクリックして
開くことがうまくできません。普通にReleaseフォルダの「○○○.exe」をダブルクリックして
立ち上げた後、このプログラム内から、「開く」でファイルを開くことはできます。また、
デスクトップに保存したファイルをダブルクリックして開くこともできます。なぜか、
My Document内に保存したファイルをダブルクリックで開くことができないです。
 My Document内のファイルをダブルクリックすると、メッセージウィンドウが出て、
「C:\My が見つかりませんでした。」
の表示が出ます。ウィンドウのタイトルには、プログラムの名前の「○○○」とでています。

メッセージウィンドウの「My」の後に半角一つのスペースがあるのが気になります。

プログラムを実装する上で、何かが足りないのでしょうか。一応、C○○○Appクラスの
InitInsatace関数内で、

m_pMainWnd->DragAcceptFiles();
EnableShellOpen();
RegisterShellFileTypes(TRUE);
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

などは実装しています。

どんなことでも結構です。何か、お気づきな点があれば、よろしくお願いします。

kng [E-Mail] 2002/05/27(月) 21:01:01
関連付けどのようにやってますか?

はまち 2002/05/27(月) 23:35:16
[[解決]]
kngさん、お返事ありがとうございます。

実は、Windowsとの関連付けは、

まず、何かのフォルダを開いたところから、
「表示」→「フォルダオプション」→「ファイルタイプ」タブ
を選んで、「登録されているファイルタイプ」から目的のファイルを選んで「編集」を
クリックし、表示されたダイアログの「アクション」項目の「編集」を選んでクリックし、
「アクションを実行するアプリケーション」でReleseフォルダ内の動かしたいプログラムの
パスを

"・・・\Release\○○○.exe"

という感じに行っていたのですが、この書込みを書きながらMSDNチュートリアルのサンプルの
scribbleと見比べていていると、自分のプログラムの間違っているところを見つけることが
できました。ありがとうございます。
パスを

"・・・\Release\○○○.exe"/dde

として、「DDEを使用する」にチェックを入れてから、DDEメッセージを

[open("%1")]

としなくてはいけないのですね。やっとできてうれしいです。

 サンプルのscribbleではこのようにWindowsの方を手動で変更しなくてもプログラムを
実行して初めてファイルを保存したときからダブルクリックでうまくできたような気がする
のですが、プログラムの方でこのように、Windows側の設定を自動で行ってくれるように
実装することができるのでしょうか。もう、僕のパソコンではWindowsとファイルが関連
付けられてしまったので確かめることができないのですが、もし、まだ一度も僕が作った
プログラムを動かしていないパソコンでプログラムを動かしたとき、自動的にこれらの
登録ができるようにしたいです。Appクラス内は、ほとんどscribble.appと同じように
したのですが、どこで、これらの設定をしているのかわかりません。

 とりあえず、今回のはできたので「解決」です。もし、心当たりがあれば、簡単な
ヒントでもいいので、できればよろしくお願い致します。

dairygoods 2002/05/28(火) 11:55:35
新規プロジェクトを作成するときに、ステップ4の[詳細設定]で
[ファイルの拡張子]を指定しておけば、
自動的にその拡張子に関連付けるコードが生成されます。

既存のプログラムを書き換えるには、
InitInstance()関数内の処理と、文字列リソースのIDR_MAINFRAMEを
拡張子付きで作ったプロジェクトを参考にして書き換えてみてください。

dairygoods 2002/05/28(火) 11:58:36
追加です。

> 僕のパソコンではWindowsとファイルが関連
> 付けられてしまったので確かめることができないのですが

エクスプローラで[ツール]-[フォルダオプション]の[ファイルタイプ]で
登録されているタイプを削除すれば関連付けは解除できます。

はまち 2002/05/30(木) 01:39:54
dairygoodsさん、いつもお世話になっています。今回もすみません。

dairygoodsさんの言った通り、[ファイルの拡張子]を指定した新規オブジェクトと同じように
プログラムすると、うまくダブルクリックで開くことができるようになりました。どうやら、
EnableShellOpen関数とRegisterShellFileTypes関数が大事な役目を持っているようですね。
実際、dairygoodsさんの言う、

>エクスプローラで[ツール]-[フォルダオプション]の[ファイルタイプ]で
>登録されているタイプを削除すれば関連付けは解除できます。

をしたところうまく行くことが確かめられました。こちらにも感謝です。

キーワードで検索したつもりでしたが、つい最近のsaraさんの書込み

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200203/02030043.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200204/02040018.txt

があったのには気づきませんでした。今回は、こちらもとても参考になりました。
saraさん、ありがとうございます。
 ただ、プログラムの起動と同時にファイルのダブルクリックで開くことはできるようになった
のですが、なぜか、アイコンだけは初めからうまく変わらず、結局、フォルダオプションから手
動で変えらなくてはならないので苦労しています。InitInstance内部もIDR_MAINFRAMEのスト
リングテーブルも、[ファイルの拡張子]を指定した新規オブジェクトと全く同じように実装して
いるはずなのですが、不思議です。

古いスレッドには追加発言できません。