single.php

Chrome 拡張機能のNative Message機能でVC++アプリから値を戻す方法

Google Chromeの拡張機能には Native Message 機能でVC++で作成した外部プロセスからに値を戻す方法を備忘録的に投稿しておきます。

Native Messageでパラメータを受け渡し

Chrome 拡張機能では外部のプログラムを実行できる Native Message 機能を利用が利用できます。

先回、Chrome拡張機能のアイコンをクリックしたイベントでパラメータの受け渡しをする手順を紹介していきます。

詳しい内容は別記事をご覧ください。

今回は、同じ機能をVC++で作成できるコンソールアプリで行う方法を紹介します。

C++でコンソールアプリの作成

Visual StudioでVC++のコンソールアプリの作成手順を念のため紹介しておきます。

1.[新しいプロジェクトの作成]画面で言語の一覧で[C++|コンソール アプリ]を選択して[次へ]をクリックします。

2.[新しいプロジェクトを構成します]画面で[プロジェクト名]を入力して[作成]をクリックします。

3. コンソールに “Hello World!” が表示されるプロジェクトが作成されます。

VC++アプリから値を返却する

Chrome拡張機能から次のようなスクリプトで、戻り値を受信します。

'use strict';
{
  chrome.action.onClicked.addListener((tab) => {
     //chrome.runtime.connectNative('native.message.sample');
     chrome.runtime.sendNativeMessage(
      'native.message.sample',
      {param1:'Hello', param2:'World'},
      errorHandle(function(response, thread){
      console.log(response);
      return true;
    );
  });

}

VC++で作成するアプリでは、次のような形で戻り値を返却します。

実際に、アプリとして利用する場合にはJSON形式に成形するためのライブラリが必要になりますが、今回は固定値のJSON文字列を返却しています。

#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");
}

void SendMessage() {
	std::string message = "{\"Message\":\"Hello\"}";
	unsigned int length = (unsigned int)message.length();

	std::cout << char(length >> 0)
		<< char(length >> 8)
		<< char(length >> 16)
		<< char(length >> 24);
	std::cout << message << std::flush;
}

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);

    SendMessage();
}

プロジェクトをビルドして、Chrome 拡張機能を実行するとGoogle Chromeのコンソール画面にアプリから返却した JSON形式の文字列が表示されます。

まとめ

今回は、短い記事になりますが、Google Chromeの拡張機能の Native Message 機能でVC++で作成した外部プログラムから値を返却するまでの手順について紹介しました。

C#の場合より、少し面倒なコードが必要になりますが、NativeMessageを利用すると別アプリケーションからの戻り値を受け取りが可能です。

Google Chrome 拡張機能で、VC++で作成した別のアプリケーションから戻り値を受け取りたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です