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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

1回答

2320閲覧

独自に既定したカスタムURLをc++から呼び出したい

ddd8

総合スコア19

C++

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

0グッド

0クリップ

投稿2020/04/20 09:29

編集2020/04/20 13:20

windows環境下で、独自に既定されたカスタムURLスキーム、例えば

hoge://aaa?b=x

のようなもので独自のアプリが起動するとき、

これをC++上で行いたいです。

試しに、
c++で、IXMLhttprequestを利用すればプログラムからも同じことができるのではと思って試しましたがopen関数で失敗しました。また、system関数を使うことでできそうな気はするのですが、こんな方法でよいのか不安です。

c++

1system("start hoge://aaa?b=x")  // これで独自アプリ起動できるけど、これでいいのか...

このようなケースでは、皆さんどのような方法で解決していますか?
system関数を利用する方法でも問題ないでしょうか。

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

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

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

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

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

ddd8

2020/04/20 13:21

なるほど、カスタムURIスキームというのですね! 参考に質問内容を修正しました。 ありがとうございます。
dodox86

2020/04/20 16:25

> system関数を使うことでできそうな気はするのですが、こんな方法でよいのか不安です。 できそうな"気がする"のか、それとも > これで独自アプリ起動できるけど、これでいいのか... "できた"のか、どちらでしょうか。それで要望どおりの動きをしているのであればOKですが。(起動するだけなので、実行した外部プログラムの入出力は得られません) hoshi-takanoriさんが案内された記事での起動例はWindowsのUWPアプリのものですので、質問者さんのC++プログラムがコマンドプロンプト上で動くようなコンソールアプリなのであれば、system関数を使うかWindows APIのShellExecuteを使うようなかたちになると思います。
ddd8

2020/04/21 10:52

ご返信ありがとうございます。 まさに、ShellExecute関数がやりたかったことでした! ShellExecute(NULL, _T("open"), _T("hoge://aaa?b=x"), NULL, NULL, SW_SHOW); のようにして、アプリの起動(ブラウザで動く)や終了をC++プログラムから行うことがしたかったです。(IEでの起動をchromeにできないでしょうか...) 起動や終了だけらなこれで大丈夫ですが、双方向通信が必要な場合はそれこそ自力でプロトコル実装をする必要があるということですね。
dodox86

2020/04/21 12:01

※解決し、BAをいただいて閉じてしまったので、私の回答コメント欄に追記しました。
guest

回答1

0

ベストアンサー

ご提示の例、hoge://aaa?b=xはURI(Uniform Resource Identifier)と言い、コロンの直前までのhogeの部分は、「スキーム(Scheme)」と言います。

http://https://ftp://file:///を見る機会があると思いますが、これらはすべてURI中のスキーム部分をWEBブラウザーなどのクライアントプログラムが自力で解釈して、それぞれに対応するプロトコルでサーバーとやり取りします。他にもgitであればgit://、subversionであればsvn://等、様々なものがありますね。それらもそれ用のクライアントプログラムやライブラリーが解釈して独自で処理しています。ブラウザーで解釈し切れないものであれば、ブラウザーへのアドインソフトのようなもので処理することもあります。httpなど、よく使われるプロトコルはライブラリで実装済みであることが多いですが、ライブラリ等でサポートしていない独自プロトコルを示すものであれば、自力でそのプロトコルを実装する必要があります。

Uniform Resource Identifier - Wikipedia

※その他詳細は、「RFC3986 URI スキーム」などの検索ワードで検索してみてください。

投稿2020/04/20 10:30

dodox86

総合スコア9256

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

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

ddd8

2020/04/20 13:24 編集

URIスキームに関する説明ありがとうございます! 教えていただいた内容をもとに質問内容を修正しました。 >自力でそのプロトコルを実装する必要があります。 なるべく楽にc++から呼び出したいと思っていますが、やはり自力で実装するしかないでしょうか...
dodox86

2020/04/21 12:02 編集

※BAをいただき、質問が閉じてしまったので質問のコメント欄より一部転載させていただき、追記させてもらいました。 [ddd8さんのコメントより] > まさに、ShellExecute関数がやりたかったことでした! > ShellExecute(NULL, _T("open"), _T("hoge://aaa?b=x"), NULL, NULL, SW_SHOW); > のようにして、アプリの起動(ブラウザで動く)や終了をC++プログラムから行うことがしたかったです。(IEでの起動をchromeにできないでしょうか...) system関数での起動は言うなればコマンドプロンプトでの起動、ShellExecuteはWindowsの既定のシェル、(エクスプローラー)で起動されるもので、どちらも得られる結果はそう大差ないはずです。(お気づきだとは思いますがShellExecuteの方が若干、細かい制御ができます)IEで起動してしまうのはhttp, https以外のスキーマを指定した場合にデフォルトブラウザの指定がそうなっているせいですが、WindowsでURLの関連付けを変更することでカスタムURIスキーム指定の際の既定のアプリを変更することができます。ですが、試したところでは最新のWindows10ではストアアプリ(UWPアプリ)でないと個別に登録するのは難しいようです。 chromeで直接開きたいのであれば、"chrome実行ファイルのPATH URL"のようにURLをコマンドラインオプションに指定して起動してしまう方法もあります。また、"hoge://aaa?b=x"を処理する独自アプリとやらも、「独自アプリのPATH "hoge://aaa?b=x"」と指定して実行することでそのまま要望どおりに起動するかもしれません。
ddd8

2020/04/21 22:32

大変勉強になります。 system関数とshellexecute関数のイメージも良く分かりました。 起動するだけなら方法はけっこうあるのですね。 教えて頂いた方法試してみます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問