ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

开发FireFox浏览器扩展(Extension)并实现与原生应用之间的消息传递(二)Windows+VB.Net

2021-05-31 17:06:24  阅读:285  来源: 互联网

标签:Dim VB outputstream End Extension demo System len 消息传递


FireFox浏览器扩展开发的详细介绍可参考https://blog.csdn.net/CityBird/article/details/115013539?spm=1001.2014.3001.5501,以下单独介绍Windows平台用VB.Net如何实现。

1、manifest.json

{
	"description":"Firefox extension demo description",
	"name": "Firefox extension demo",	
	"manifest_version":2,  
	"version":"1.0",
	"icons":{"48": "ICONS/ICON_48.png"},
	"applications":{"gecko":{"id": "demo@demo.com","strict_min_version": "50.0"}},
	"background":{"scripts":["background.js"]},
	"browser_action":{"default_icon":{"48": "ICONS/ICON_48.png"}}, 
	"permissions":["nativeMessaging"]
}

2、background.js

function onResponse(response) {
  console.log("background Received " + JSON.stringify(response));
}
 
function one rror(error) {
	console.log(`background Error: ${error}`);
}
 
/*
On a click on the browser action, send the app a message.
*/
browser.browserAction.onClicked.addListener(() => {
  var JsonObj = {"name":"张三","sex":"男"};
  console.log("send:"+JSON.stringify(JsonObj));
  var sending = browser.runtime.sendNativeMessage("Demo",JsonObj);
  sending.then(onResponse, one rror);
});

3、demo.json

{
  "name": "Demo",
  "description": "Demo app",
  "path": "Demo.exe",
  "type": "stdio",
  "allowed_extensions": [ "demo@demo.com" ]
}

4、demo.exe

Visual Studio里用VB新建一个控制台应用(.Net Framework),Module1.vb源码如下:

Module Module1
    Private isDebug As Boolean = False      '是否debug模式
    Private currentDir As String = ""       '当前程序所在目录

    Sub Main()
        If Not IsNothing(System.Configuration.ConfigurationManager.AppSettings("debug")) Then                   '读debug设置
            If System.Configuration.ConfigurationManager.AppSettings("debug").ToString.ToLower = "true" Then
                isDebug = True
            Else
                isDebug = False
            End If
        End If

        currentDir = System.Environment.CurrentDirectory                                                        '取当前程序目录

        Dim str As String = ""
        Do
            str = GetMessage()
            WriteMessage(str)
        Loop While (False)
    End Sub

    ''' <summary>输入</summary>
    ''' <returns>接收到的内容</returns>
    Private Function GetMessage() As String
        Try
            Dim inputStream As System.IO.Stream = Console.OpenStandardInput
            Dim inputLen As Integer = 0, tmp As Byte
            For xx As Integer = 0 To 3
                tmp = inputStream.ReadByte
                inputLen = inputLen + tmp * Math.Pow(255, xx)
            Next
            WriteLog(" InLength:" & inputLen)

            Dim inputBuff(inputLen - 1) As Byte
            For xx As Integer = 0 To inputLen - 1
                inputBuff(xx) = inputStream.ReadByte
            Next

            inputStream.Close()
            inputStream.Dispose()
            inputStream = Nothing

            WriteLog(" InMessage :" & System.Text.UTF8Encoding.UTF8.GetString(inputBuff))
            Return System.Text.UTF8Encoding.UTF8.GetString(inputBuff)
            Erase inputBuff
        Catch ex As Exception
            WriteLog(" Error :" & ex.Message)
            Return ""
        End Try
    End Function

    ''' <summary>输出</summary>
    ''' <param name="strMessage">需要输出的内容,前4个字节代表输出内容的长度</param>
    Private Sub WriteMessage(ByVal strMessage As String)
        Try
            Dim arr() As Byte = System.Text.Encoding.UTF8.GetBytes(strMessage)
            Dim len As Integer = arr.Length
            WriteLog(" OutLength :" & len)

            Dim outputstream As System.IO.Stream = Console.OpenStandardOutput
            outputstream.WriteByte(len Mod 255)
            len = len \ 255
            outputstream.WriteByte(len Mod 255)
            len = len \ 255
            outputstream.WriteByte(len Mod 255)
            len = len \ 255
            outputstream.WriteByte(len)
            outputstream.Write(arr, 0, arr.Length)
            Erase arr
            outputstream.Close()
            outputstream.Dispose()
            outputstream = Nothing

            WriteLog(" OutMessage :" & strMessage)
        Catch ex As Exception
            WriteLog(" Error :" & ex.Message)
        End Try
    End Sub

    ''' <summary>写日志</summary>
    ''' <param name="strLog">需要写入日志的内容</param>
    Private Sub WriteLog(ByVal strLog As String)
        If isDebug Then
            Dim myStreamWrite As New System.IO.StreamWriter(currentDir & "\Log.txt", True)
            myStreamWrite.WriteLine(Now.ToString("yyyy-MM-dd HH:mm:ss") & strLog)
            myStreamWrite.Close()
            myStreamWrite.Dispose()
            myStreamWrite = Nothing
        End If
    End Sub
End Module

App.config源码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <appSettings>
    <add key="debug" value="true"/>
  </appSettings>
</configuration>

5、注册表

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Mozilla\NativeMessagingHosts\Demo]
@="请使用demo.json文件的完整路径替换"

全部源代码下载

标签:Dim,VB,outputstream,End,Extension,demo,System,len,消息传递
来源: https://blog.csdn.net/CityBird/article/details/117417587

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有