Electron+Node调用Windows API 获取定位信
声明:本文参考了地址:https://github.com/NodeRT/NodeRT 整理出了如何在Electron框架中通过Node.js使用Windows 10 APIs进行原生定位的过程。
本文主要描述:
1、如何在Electron框架中通过Node.js使用Windows 10 APIs进行原生定位。
2、使用NodeRT, 通过为所有Windows名称空间生成Node模块,自动将Microsoft的UWP / WinRT API公开给Node.js环境。 这使Node.js开发人员可以编写使用本机Windows功能的代码。 生成的模块的API(几乎)与MSDN上列出的WinRT API相同。
具体开发步骤
开发环境准备工作
- 先查看windows系统版本,进入windows命令行窗口之后,输入‘winver’命令回车可以查看到具体的版本信息了

- 进入 https://www.npmjs.com/search?q=windows.devices.geolocation 查找对应windows版本的NodeRT模块,查找与系统版本匹配或更高的版本,例如:

- 仔细阅读windows.devices.geolocation模块文档,筛选出对应哪些依赖环境, 一般Prequisites有:1)node-gyp 2)Visual Studio 3)win 10 SDK 4) Python 这个要根据具体的nodert模块的要求

环境搭建
node安装
下载地址:https://nodejs.org/en/download/
-
先查看node环境,若没有安装node, 登录Node.js官方网站,下载Node.js软件包。请自行选择系统对应的软件包。版本推荐为v12+
-
点击下载后的软件包进行安装,全部按照默认设置点击Next,直至Finish。安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。在cmd命令窗口中直接使用node或npm命令显示版本号即安装成功。

Ps: npm 是node的包管理器,里面有很多可以下载的工具包,插件等等,例如node-gyp,直接使用npm install 包名 -g 下载就可以了,具体可以根据项目要求然后按照教程下载安装。
node-gyp安装
什么是node-gyp?
gyp是一种根据c++源代码编译的工具,node-gyp就是为node编译c++扩展的时候使用的编译工具,NodeRT模块是C++源代码实现的,如需公开给Node.js环境直接调用需要使用node-gyp重编译。依赖node环境。
- 根据 windows.devices.geolocation模块 全局安装对应的 node-gyp 版本
npm install -g node-gyp

- 安装完毕之后node-gyp list看一下,显示如下:

若没有开发环境相关文件,提示使用 node-gyp install安装
- node-gyp install安装头文件和静态库
显示如下:

这里提示最后一个静态库404了,找不到,在之后node-gyp编译文件时就会报错

到时需要手动下载一下,下载地址:https://nodejs.org/download/release/v12.19.0/win-x64/node.lib
然后放到上一步提示报错的位置,替换掉残缺的文件!
- 最后node-gyp list看一下

到这里我们还不可以进行编译,因为node-gyp需要依赖python环境和微软的c++构建工具来进行编译
Visual Studio安装
下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/
-
根据windows.devices.geolocation模块下载对应的Visual Studio 版本,这里下载的Visual Studio 2019 (Community)版本
-
安装时勾选c++, windows开发,并勾选对应版本的win 10 sdk,如图:

-
若是没有对应的win 10 sdk可选,则可以单独去下载安装;
-
完成下载,完成安装;

- 安装好了以后要配置一下依赖,让node-gyp可以找到依赖
npm config set msvs_version 2019 // 2019为当前vs版本
win10 sdk安装
下载地址:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/
- 安装 Visual Studio 2019 (Community)版本时若是没有对应的win10 sdk 版本可选,则可以单独去选择对应版本下载安装;

- 完成下载,完成安装;





Python安装
下载地址:https://www.python.org/downloads/
-
根据windows.devices.geolocation模块下载对应的python版本,
-
安装的时候会有一个选项是添加PATH,自动添加环境变量,可以勾选,但是安装完以后还是要去环境变量里面查看一下是否添加了
-
若自动添加环境变量失败则需手动添加python变量

- 环境变量添加完成之后打开cmd输入python 命令查看,如出现版本信息则代表安装成功。

- 安装好了以后要配置一下依赖,让node-gyp可以找到python依赖
npm config set python python3.8 // 3.8为当前python版本
api调用说明
- node环境下,项目工程下添加模块依赖:
npm install @nodert-win10-20h1/windows.devices.geolocation
成功后会在package.json dependencies 中生成一条记录
"dependencies":{
"@nodert-win10-20h1/windows.devices.geolocation":"^0.1.0"
}
对应node_modules成功添加@nodert-win10-20h1/windows.devices.geolocation依赖包
- 使用node-gyp重建此模块,请确保使用--msvs_version = 2012/2013/2015/2017/2019标志使用适当的VS版本:
cd @nodert-win10-20h1/windows.devices.geolocation
node-gyp rebuild --msvs_version=2019

- 在集成node环境中使用,使用方法如下:

常见问题
1. 添加模块依赖编译时常见报错:node.lib文件报错

这是node-gyp install安装头文件和静态库时有个文件下载失败,需要手动下载一下,下载地址:https://nodejs.org/download/release/v12.19.0/win-x64/node.lib
然后放到上一步提示报错的位置,替换掉残缺的文件,重新添加即可成功!
2. 添加模块依赖编译时常见报错:未能找到的程序集platform.winmd

这个错误一般是由于依赖和vs、sdk版本对应不上导致的问题,所以在下载依赖前要先仔细看文档,了解依赖编译的先决条件
3. fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径
其实这个问题就是代码的问题,根据这个 issue 中的描述,当前版本的 NodeRT 只会去扫描 C:\Program Files (x86)\Windows Kits\10\UnionMetadata 路径下的 .winmd 文件,硬编码了依赖库目录(不过也说得通)。
所以解决方案就是,把你的 Windows.winmd 文件放到这个文件夹下就行了,默认安装的 Windows 10 SDK 应该都在这个文件夹下的一个个子文件夹,直接把对应版本的 Windows.winmd 挪出来就行。
比如说我就把 C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.19041.0\Windows.winmd 这个文件往上移动了一级,也就是移动到了 .. 文件夹。现在再去安装,就已经可以了.
4.使用了此NodeRT打包之后在windows系统平板上安装报错

从报错信息明显得知是缺少了一些必要的依赖库所以导致应用安装报错。通过多番测试得知是由 NodeRT引起的。它只有在安装了带有 Windows 10 SDK 的 Visual Studio 时才有效。这导致在 Electron 应用程序中使用NodeRT进行定位是非常无用的,因为每个用户平板都必须同时安装 Visual Studio。这个解决方案显然是不合常理的。所以我们需要去跟踪到底缺少了哪些原因依赖库?
这是部署 Windows 桌面应用程序的一个普遍问题,需要确保应用程序所依赖的 DLL到底缺少哪些。
参考链接:https://github.com/NodeRT/NodeRT/issues/87
依赖比对软件:http://www.dependencywalker.com/
根据报错信息使用工具对比找到依赖库,将对应的DLL依赖打入安装包。



找出缺失的的DLL依赖之后,在electron-builder配置中增加extraFiles设置(打包额外的文件放在项目的根目录),将对应的DLL依赖打入安装包,即可解决安装报错问题。
