123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 'use strict'
- /**
- * 软件安装检测
- *
- * @author EllisRan.
- * @date 2018/8/9
- * @version
- */
- import db from '../../database'
- const path = require('path')
- const ffi = require('ffi')
- const fs = require('fs')
- const electron = require('electron')
- const ipcMain = electron.ipcMain
- const regeditPath64 = 'HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall'
- const regeditPath32 = 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall'
- const regeditPath = isOSWin64() ? regeditPath64 : regeditPath32
- const regedit = require('regedit')
- const exeinstall = function (win) {
- ipcMain.on('checkExeInstall', (event, args) => {
- let info = args.info
- try {
- // 先检查数据库中是否已存在该注册表软件的信息,有则退出,无则继续
- let exesqlinfo = db.read().get('sc_exeData').find({ regeditName: info.regedit, fileVersion: info.version }).value()
- if (exesqlinfo !== undefined) {
- event.sender.send('InstallResult', { status: 400, msg: `启动器已存在相同版本的 ${info.fulltitle} 软件`, id: info.id, index: args.index })
- } else {
- let regeditpath = path.join(regeditPath, info.regedit)
- regedit.list(regeditpath, async function (err, result) {
- if (err === null && result !== undefined) {
- let values = result[regeditpath].values
- let regeditMsg = {
- path: values['Inno Setup: App Path'].value,
- name: values['DisplayName'].value,
- regeditName: info.regedit,
- fileName: values['Inno Setup: Icon Group'].value,
- simpleName: info.product_title,
- versionName: info.title,
- keyNumber: info.key_number,
- keytype: info.keytype,
- isshow: true,
- auto: false,
- pid: info.pid,
- product_id: info.product_id,
- down_id: info.down_id,
- product_version: info.version,
- show_tip: false,
- show_updateVersion: info.version
- }
- let data = await checkDirectory(regeditMsg.path)
- for (let i = 0; i < data.length; i++) {
- let exeinfo = regeditMsg
- exeinfo.exeName = data[i].exeName
- exeinfo.fileVersion = data[i].FileVersion
- exeinfo.productName = data[i].ProductName
- exeinfo.productVersion = data[i].ProductVersion
- exeinfo.fileDescription = data[i].FileDescription
- exeinfo.addtime = Date.parse(new Date()) / 1000
- db.read().get('sc_exeData').insert(exeinfo).write()
- }
- db.read().get('sc_productData').updateById(info.pid, { isshow: true }).write()
- await db.read().get('sc_productData').updateById(info.pid, { isshow: true }).write()
- await db.read().set('sc_hadInstall.url', '/softwarestartup/' + info.pid).write()
- event.sender.send('InstallResult', { status: 200, msg: data.length, id: info.id, index: args.index })
- win.webContents.send('successUpdate', { id: info.pid, num: data.length, delnum: 0 })
- } else {
- event.sender.send('InstallResult', { status: 400, msg: `未能成功安装 ${info.fulltitle} 软件`, id: info.id, index: args.index })
- }
- })
- }
- } catch (err) {
- event.sender.send('InstallResult', { status: 400, msg: err, id: info.id, index: args.index })
- }
- })
- /**
- * 判断文件名是否包含纵横软件exe的部分名称
- * @param item
- * @return {boolean}
- */
- function existSoftwareName (item) {
- // 纵横软件exe所带包含的文件名
- const smartcostSoftwareHeader = ['SmartCost', 'Measure', 'DrawingBuilder', 'BillsEditor']
- let flag = false
- for (let i = 0; i < smartcostSoftwareHeader.length; i++) {
- if (item.indexOf(smartcostSoftwareHeader[i]) !== -1) {
- flag = true
- break
- }
- }
- return flag
- }
- /**
- * 检查文件夹并判断是否包含纵横软件(一个文件可能存在多个纵横软件的)
- * @param files
- * @return {Promise.<Array>}
- */
- async function checkDirectory (files) {
- let data = []
- let dirname = await fs.readdirSync(files)
- dirname.forEach(async function (item, index) {
- if (path.extname(item) === '.exe' && existSoftwareName(item)) {
- let pathstr = path.join('data/fileInfo.dll')
- let libm = ffi.Library(pathstr, {
- 'GetFileInfo': ['string', ['string']]
- })
- let fileinfo = JSON.parse(await libm.GetFileInfo(path.join(files, item)))
- fileinfo.exeName = item
- data.push(fileinfo)
- }
- })
- return data
- }
- }
- /**
- * 判断系统位数
- * @return {boolean}
- */
- function isOSWin64 () {
- return process.arch === 'x64' || process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')
- }
- export default exeinstall
|