如何把Electron做成一个Runtime,让多个应用共享同一个Electron
这个问题涉及到很多知识,而且要想把这个Runtime做好很绕。
下面我就说一下我的思路:
(以下内容以Windows平台为基础,Mac平台和Linux平台还得去调查一下,才能确定是否可行)
首先,我们先区分三类用户:
- Runtime建设者(就是我们)
- Runtime使用者(就是使用Runtime的开发者)
- 最终用户(就是使用Runtime开发者开发的应用的那些用户)
接下来我们就以Runtime建设者的视角来审视这项工作
首先我们要为Runtime使用者提供一个专有的打包工具,我们就叫它:打包工具。这个打包工具还内置了几个可执行程序,我们给他们起个名字,分别叫:
- 最终安装程序
- 最终执行程序
- 最终卸载程序
好,我们一个一个聊他们的职责
打包工具的职责
按Runtime使用者的要求修改最终执行程序的图标、应用签名、版本、版权、文件名等资源信息;
按Runtime使用者的要求修改最终卸载程序的图标、应用签名、版本、版权、文件名等资源信息;
把最终执行程序、最终卸载程序与Runtime使用者开发好的HTML/CSS/JS等静态文件放到一起,压缩成一个压缩包,我们叫他:资源文件
把这个资源文件以资源的形式封装到最终安装程序中;
按Runtime使用者的要求修改这个最终安装程序的图标、应用签名、版本、版权、文件名等资源信息;
(修改资源的代码,后文有介绍)
这几个工作完成之后,Runtime使用者就可以把这个最终安装程序分发给最终用户了。
最终安装程序的职责
这个最终安装程序在最终用户的电脑上运行时,会完成以下工作:
检查最终用户的注册表,看其是否安装了我们的Electron Runtime
如果没有安装,则下载Electron的发行版,释放到一个特定目录下,并在注册表记下来。
在这个特定目录下记录当前应用的信息(卸载当前应用时要用到);
把自身的资源释放到最终用户指定的目录内,也就是前文说的资源文件
解压缩资源文件得到最终执行程序、最终卸载程序和Runtime使用者开发的HTML/CSS/JS等静态文件
写注册表记录最终卸载程序的位置,这样用户就可以在控制面板里卸载我们的程序了。
按最终用户的要求,创建开始菜单图标、桌面图标,这些图标均指向最终执行程序
(读取资源的代码,后文有介绍)
如果最终用户工作在没有网络的环境下,那么我们也可以允许Runtime使用者把Electron Runtime打包到最终安装程序内,这是打包工具的职责。
如果担心Electron官方提供的下载地址速度慢,可以考虑使用国内镜像地址:npmmirror.com/mirrors/electron/
最终执行程序的职责
检查用户注册表,找到Electron Runtime的放置路径
启动Electron Runtime并把当前应用的入口程序当做参数传给Electron.exe,应用入口程序就是Runtime使用者开发HTML/CSS/JS等静态文件之一,
electron.exe path/to/entry.js
最终卸载程序的职责
删除安装目录下的文件
删除注册表的卸载程序信息
删除Electron Runtime所在目录下的应用程序信息,如果发现没有别的应用在依赖Electron Runtime了,那么就把Electron Runtime所在目录也删掉。
把一个文件作为资源写入一个可执行程序的代码如下所示:
HANDLE hFile;
DWORD dwFileSize,dwBytesRead;
LPBYTE lpBuffer;
char szFile[MAX_PATH+1] = {0};
::GetDlgItemText(hwnd,EditId,szFile,MAX_PATH);
hFile = CreateFile(szFile,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
dwFileSize = GetFileSize(hFile, NULL);
lpBuffer = new BYTE[dwFileSize];
ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL);
HANDLE hResource = BeginUpdateResource(szFilePath, FALSE);
UpdateResource(hResource,RT_RCDATA,MAKEINTRESOURCE(EditId),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPVOID)lpBuffer,dwFileSize);
EndUpdateResource(hResource, FALSE);
delete [] lpBuffer;
CloseHandle(hFile);
return 1;
可执行程序读取自身资源,把资源写到指定路径下的代码如下:
HMODULE hInstance = ::GetModuleHandle(NULL);
TCHAR szFilePath[MAX_PATH + 1];
GetPath(szFilePath,resourceName,hInstance);
HRSRC hResID = ::FindResource(hInstance,resourceID,RT_RCDATA);
HGLOBAL hRes = ::LoadResource(hInstance,hResID);
LPVOID pRes = ::LockResource(hRes);
DWORD dwResSize = ::SizeofResource(hInstance,hResID);
if(!dwResSize) return 0;
HANDLE hResFile = CreateFile(szFilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWritten = 0;
WriteFile(hResFile,pRes,dwResSize,&dwWritten,NULL);
CloseHandle(hResFile);
if(dwResSize == dwWritten) return 1;
return 0;
这两段代码是从我的一个项目中摘抄出来的,仅供参考。
遗留的问题
我们并没有考虑多Electron版本共存的问题;
此方案高度依赖Windows API,跨平台实现差异肯定会比较大;
应用程序启动后,任务栏的图标是Electron Runtime的图标,而非Runtime使用者指定的图标(这是有解决办法的);

如何把Electron做成一个Runtime,让多个应用共享同一个Electron的更多相关文章
- 如何将打包好的文件做成一个APP
本文主要是用来简短的对做成一个APP进行说明,内容可能不是多详细,但会给出具体思路.(仅供参考) 因为各种打包和生成APP的方式多样,今天这里仅仅对用Hbuilder打包进行说明. 1.首先当然需要一 ...
- 跟我一起使用electron搭建一个文件浏览器应用吧(四)
在软件的世界里面,创建一个新项目很容易,但是坚持将他们开发完成并发布却并非易事.分发软件就是一个分水岭, 分水岭的一边是那些完成的被全世界用户在用的软件,而另外一边则是启动了无数项目却没有一个完成的. ...
- 使用electron开发一个h5的客户端应用创建http服务模拟后台接口mock
使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock 在上一篇<electron快速开始>里讲述了如何快速的开始一个electron的应用程序,既然electr ...
- electron教程(番外篇二): 使用TypeScript版本的electron, VSCode调试TypeScript, TS版本的ESLint
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...
- win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。
WIN7凭据管理器,如果你用一个帐号远程登录以后在电脑中会记住这个信息,假如你想用另外的帐号,那么就到控制面板-凭据管理器里中进行修改或者删除. 如果你登录以后提示,“无法访问.不允许一个用户使用一个 ...
- JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令
通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过.基本原理是,首先通过 Runtime.getR ...
- 把linux可执行程序做成一个服务[转]
转自:http://www.2cto.com/os/201202/121249.html 在linux系统启动的时候,我们可以看到很多服务性程序一个接一个的被启动(就是那些后面有一个兰色[OK]的行) ...
- Jquery 类似新浪微博,鼠标移到头像,用浮动窗口显示用户信息,已做成一个jquery插件
请注意!!!!! 该插件demo PHP 的 demo下载 C#.NET的demo下载 需要如下图, 1.鼠标移动到头像DIV时,Ajax获取数据,并让浮动DIV显示出来. 2.鼠标可以移动到上面浮 ...
- Electron 创建一个空白的界面
添加应用 首先添加一个Lorikeet版本的Electron应用. 'use strict' const electron = require('electron'); const app = ele ...
随机推荐
- 一类巧妙利用利用失配树的序列DP
I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...
- Python使用print打印时,展示内容不换行
原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...
- C++ and OO Num. Comp. Sci. Eng. - Part 1.
本文参考自 <C++ and Object-Oriented Numeric Computing for Scientists and Engineers>. 序言 书中主要讨论的问题是面 ...
- python-django-聚合与统计
l例子1: 这里的values_list 相当于SQL语句里面的GROUP BY的功能,但是返回的是一个元组 要实现示例当中的直接用,与数据库格式有关将模型设计得更加完美 模型: 注意related_ ...
- logname
logname命令用来显示用户名称. 语法 logname(选项) 选项 --help:在线帮助: --vesion:显示版本信息.
- window10快捷键 + 浏览器常用通用快捷键
一.window10快捷键 1.win+tab 缩小版的显示出桌面打开的所有窗口,然后再结合上下左右键加enter选择想要的窗口: 如果不想选择或者保留原有显示窗口,再按win+tab 或者 ...
- 搭建zabbix服务器常见问题解析处理
1. 找不到url 2. 服务器无法处理当前请求,PHP解析出错 3. 服务器无法处理当前请求,权限不足 1. 找不到url 浏览器报错:The requested URL /zabbix/ was ...
- Mssql主备见证的弊端及主备模式主down掉怎么恢复
mssql主备见证有个没有解决的问题,mssql的主备是针对单个库的,有时候单个或多个库主备切换了,但是整个主数据库并没有挂掉,并且还运行着其他的库,程序检测到的数据库连接是正常的,只是部分库连接不了 ...
- 巩固javaweb第十四天
巩固内容: 单行文本框: 单行文本框的基本语法格式如下: < input type="text" name="输入信息的字" value=" ...
- HDFS04 HDFS的读写流程
HDFS的读写流程(面试重点) 目录 HDFS的读写流程(面试重点) HDFS写数据流程 网络拓扑-节点距离计算 机架感知(副本存储节点的选择) HDFS的读数据流程 HDFS写数据流程 客服端把D: ...