質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

5566閲覧

C++でのファイル拡張子関連付け

BeatStar

総合スコア4958

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/15 02:26

C/C++ ( Windows API 実装あり ) でやっています。

以前 (多分 このサイトで) 似たような質問をしたのですが、再度投稿します。

VC++ ではなく MinGW でやっています。 ( つまり MFC は使えない。 )

C/C++ の実行ファイル ( あるいは DLL ) から 「ファイルの関連付け」を行いたいのですが、

どうすればよいでしょうか。

レジストリを書き換える方法があるようですが、この方法だとどこを書き換えるべきなのか...

やりたいことは、

  • (外出先で) 画像を閲覧する場合、画像ビューアを USBに入っている実行ファイル ( 例: MassiGra ) で閲覧できるようにする (※1)

  • 本来は存在しない独自の拡張子 ( 例: *.abc ) を作り、この実行ファイル用ファイルとする

  • ( オプションとして。 ) Java の JARファイルを ダブルクリックで開けるように設定する

です。

最低でも、
「画像を閲覧...」と「本来は...」の二つ
です。

前回質問したときに頂いた回答では、
「猫でも」の「WindowsAPI版」で、
レジストリを書き換えて...とやるやつでした。

ですが、そのソースコードではどこを書き換えるべきなのか...

できれば、

C++

1/* 2 関数名: ExchangeExtensionSet 3 用 途: 拡張子の関連付け 4 引 数: 5 const char *ext := 対象拡張子 6 const char *exe := 実行ファイルのパス 7 戻り値: 8 bool 9*/ 10bool ExchangeExtensionSet( const char *ext, const char *exe ); 11

とすると、

C++

1if( ExchangeExtensionSet( ".jpg", "C:\\massigra\\MassiGra.exe" ) ){ 2 MessageBox( NULL, "設定完了!", "Result", MB_OK ); 3}else{ 4 MessageBox( NULL, "登録失敗", "Result", MB_OK ); 5}

という感じでできたらなぁと。

自分で組むのはいいですが、

どこをどう書き換えるべきなのかがわかりません。

レジストリの中身を変更する関数の引数が 意味がわかりません。

( 定数部分はともかく、文字列の部分とか。 )

どなたかご教授下さい。

[環境等]
言語 : C/C++
WindowsAPI : あり
コンパイラ : MinGW ( つまり、MFC は不可能 )

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

拡張子の関連づけをプログラムから行うには、レジストリを書き換えてからSHChangeNotifyというAPIを呼び出せば出来ます。(SHCNE_ASSOCCHANGEDで呼び出す)

レジストリは、HKEY_CLASSES_ROOT/ドキュメント名/shell の下に開くであればopen、印刷であればprintやprinttoのキーを作成し、それぞれにcommandとddeexecのキーを作成します。(ドキュメント名はバッティングしないように独自のものにすればOK)
DDEは今更な感じがしますが、通常はopenのキーの中の規定値(REG_SZ)として

"プログラムパス" "%1"

を書き込めば行けます。
テキストファイルをダブルクリックした時にメモ帳で開いているのであれば、メモ帳の設定を参考にすれば行けると思います。

私も業務で作成しているアプリで同じようにしています。(MFCですがWin32でも同じ処理になります)

下記の例もMFCですが使ってるのはレジストリの書き換えにMFCのクラスを使っているだけで、置き換えは難しくはないと思います。
拡張子の関連付けと解除

投稿2016/11/15 08:51

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

Windows APIにレジストリ操作用のAPIがありますので、ishi9さんがリンクされているサイトに書かれているキーを変更するためのプログラムを書くか、.regファイルを書いてそれでレジストリを設定することになると思います。

ただ、Windows 10(もしかするとWindows 8?)で、レジストリ操作の難易度が更に上がりました。削除できても追加できないキーがあってかなりハマりました。
Windows 7からのバージョンアップでタスク・スケジューラがおかしくなったので、キーをバックアップしてから、試しに削除し、ダメだったので回復しようとしたけど回復できないのです。システムの復元でも回復できないし、IMEが起動しなくなってまともに日本語入力できず対策の調査もままならず、泣きそうでした。

脅すわけではないですが、プログラムでレジストリを修正する場合は、こわれてもよいWindowsでデバッグすることをお勧めします。VirtualBox等の仮想マシンを使えば物理PCを別途用意する必要はないです。

投稿2016/11/15 03:46

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

学習が目的ではなく成果が目的なら、バッチ書くほうがはるかに簡単だと思いますよ。
Windowsのコマンドプロンプトでファイル拡張子の関連付けを変更する

追記:
久々に自分のところでやってみたら上手く動作しませんでした。
調べてみるとそういう人は結構いるようです。
その場合はレジストリの変更からやる必要がありそうですね。
変更すべきレジストリの参考URL

投稿2016/11/15 02:32

編集2016/11/15 03:05
ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問