Google Chromeの拡張機能には Native Message 機能でVC++で作成した外部プロセスに値を受け渡す方法を備忘録的に投稿しておきます。
Native Messageで外部プログラムを実行
Chrome 拡張機能では外部のプログラムを実行できる Native Message 機能を利用が利用できます。
先回、C#のコンソールアプリを自作して Chrome拡張機能のアイコンをクリックしたイベントでパラメータの受け渡しをする手順を紹介していきます。
詳しい内容は別記事をご覧ください。
今回は、同じ機能をVC++で作成できるコンソールアプリで行う方法を紹介します。
C++でコンソールアプリの作成
Visual StudioでVC++のコンソールアプリの作成手順を念のため紹介しておきます。
1.[新しいプロジェクトの作成]画面で言語の一覧で[C++|コンソール アプリ]を選択して[次へ]をクリックします。
2.[新しいプロジェクトを構成します]画面で[プロジェクト名]を入力して[作成]をクリックします。
3. コンソールに “Hello World!” が表示されるプロジェクトが作成されます。
外部プログラムに値を受け渡す
Chrome 拡張機能から外部プログラムを実行するJSON形式のファイルを作成します。
詳しい内容は、別記事をご覧ください。
VC++アプリで値を受け取る
Chrome拡張機能から次のようなスクリプトで、JSON形式で値を送信します。
'use strict';
{
chrome.action.onClicked.addListener((tab) => {
//chrome.runtime.connectNative('native.message.sample');
chrome.runtime.sendNativeMessage(
'native.message.sample',
{param1:'Hello', param2:'World'}
);
});
}
VC++で作成するアプリでは、次のような形で値を受け取ります。
実際に、アプリとして利用する場合にはJSON形式をC++で扱える形式に変換する必要がありますが、今回は受け取った文字列を直接メッセージボックスで表示します。
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <codecvt>
#include <windows.h>
void setBinaryMode() {
int result;
result = _setmode(_fileno(stdin), _O_BINARY);
if (result == -1)
perror("Cannot stdin set mode");
result = _setmode(_fileno(stdout), _O_BINARY);
if (result == -1)
perror("Cannot stdout set mode");
}
int main()
{
// std::cout << "Hello World!\n";
setBinaryMode();
unsigned int length = 0;
for (int i = 0; i < 4; i++)
{
unsigned int read_char = getchar();
length = length | (read_char << i * 8);
}
std::string str_msg = "";
for (int i = 0; i < (int)length; i++)
{
str_msg += getchar();
}
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> conv;
std::wstring wstr_msg = conv.from_bytes(str_msg);
LPCWSTR lpcwstr_msg = wstr_msg.c_str();
MessageBox(NULL, lpcwstr_msg, L"Native Message", MB_ICONINFORMATION);
}
プロジェクトをビルドして、Chrome拡張機能を実行するとメッセージボックスに送信したJSON形式の文字列が表示されます。
外部プロセスから戻り値を受け取る方法については別記事をご覧ください。
まとめ
今回は、短い記事になりますが、Google Chromeの拡張機能の Native Message 機能でVC++で作成した外部プログラムにパラメータを受け渡して実行させるまでの手順について紹介しました。
C#の場合より、少し面倒なコードが必要になりますが、NativeMessageを利用すると別アプリケーションをChrome拡張機能から実行できます。
Google Chrome 拡張機能で、VC++で作成した別のアプリケーションを実行する際に値を受け渡しをしたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただきありがとうございます。