first commit
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
node_modules/
|
||||
dist/
|
||||
*.log
|
||||
.DS_Store
|
||||
9
.npmrc
Normal file
9
.npmrc
Normal file
@@ -0,0 +1,9 @@
|
||||
registry=https://registry.npmmirror.com
|
||||
electron_mirror=https://npmmirror.com/mirrors/electron/
|
||||
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/
|
||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
|
||||
ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/
|
||||
sass_binary_site=https://npmmirror.com/mirrors/node-sass
|
||||
phantomjs_cdnurl=https://npmmirror.com/mirrors/phantomjs
|
||||
chromedriver_cdnurl=https://npmmirror.com/mirrors/chromedriver
|
||||
operadriver_cdnurl=https://npmmirror.com/mirrors/operadriver
|
||||
16
20251201-5EEE-2929-FA83-5954.lic
Normal file
16
20251201-5EEE-2929-FA83-5954.lic
Normal file
@@ -0,0 +1,16 @@
|
||||
<License>
|
||||
<Id>d1fc286b-faeb-456e-81c5-93148c0f62fc</Id>
|
||||
<Type>Standard</Type>
|
||||
<Expiration>Sun, 30 Nov 2025 16:00:00 GMT</Expiration>
|
||||
<Quantity>1</Quantity>
|
||||
<ProductFeatures>
|
||||
<Feature name="LicVersion">3</Feature>
|
||||
<Feature name="ProjectSN">10303</Feature>
|
||||
<Feature name="SerialNumber">5EEE-2929-FA83-5954</Feature>
|
||||
</ProductFeatures>
|
||||
<Customer>
|
||||
<Name>北京灏博云天科技有限公司</Name>
|
||||
<Email>Obosky@Obosky.com</Email>
|
||||
</Customer>
|
||||
<Signature>i1p7HPl5bD5VBg5SpXGX91U/i5ajnJYTjeujkat9C2TsSBbICwapHw2MObkTve45FuAT0Yd37gSfthltbVY1QBbgYeY1mJRfooJMt7xbtOpsZIQfEo88XkUHGLJ0E05WFmY5+Cy1MQhwvNQyomd7wrlCaB3J8AgfWPTGhFAggi9jUTRA/9ZIZKIwX+m1PRfxHRt85STFQzKC1kK9mBC89YUz4vI8tHzWg/vIlJf6iCSZVr6lv8StvRMD+T55qyXQbu84BjObNnMAs6Z63snQfjvu6b28IMuoSIAd73fC8DdRF0OUeX+qvjMcCpMXWaCvXpDIE87bpJVPh/7MSyQUJg==</Signature>
|
||||
</License>
|
||||
234
README.md
Normal file
234
README.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# FFI-NAPI Electron Application
|
||||
|
||||
基于 Electron 20 的 外壳程序。
|
||||
|
||||
## 特点
|
||||
|
||||
- **源码可见**:打包后 main.js、index.html、test.js 等文件保留在 resources/app 目录中
|
||||
- **便携版**:无需安装,双击运行
|
||||
- **支持 32 位和 64 位**
|
||||
|
||||
## 安装依赖
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
或使用国内镜像:
|
||||
|
||||
```bash
|
||||
.\install-electron.bat
|
||||
```
|
||||
|
||||
## 添加图标(必须步骤)
|
||||
|
||||
**在打包前必须完成:**
|
||||
|
||||
1. 创建 `build` 文件夹:
|
||||
```bash
|
||||
mkdir build
|
||||
```
|
||||
|
||||
2. 准备一个 `.ico` 格式的图标文件
|
||||
- 推荐尺寸:256x256 像素
|
||||
- 必须是 `.ico` 格式(不是 `.png` 或 `.jpg`)
|
||||
|
||||
3. 将图标文件重命名为 `icon.ico`
|
||||
|
||||
4. 将 `icon.ico` 复制到 `build` 文件夹中
|
||||
|
||||
5. 验证图标文件:
|
||||
```bash
|
||||
node verify-icon.js
|
||||
```
|
||||
|
||||
## 运行开发模式
|
||||
|
||||
```bash
|
||||
npm start
|
||||
```
|
||||
|
||||
## 打包便携版
|
||||
|
||||
### 推荐:使用完整重新打包脚本
|
||||
|
||||
```bash
|
||||
.\rebuild-with-icon-fix.bat
|
||||
```
|
||||
|
||||
### 单独打包
|
||||
|
||||
32位便携版:
|
||||
```bash
|
||||
npm run build:32
|
||||
```
|
||||
|
||||
64位便携版:
|
||||
```bash
|
||||
npm run build:64
|
||||
```
|
||||
|
||||
同时打包:
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
## 便携版使用说明
|
||||
|
||||
### 打包后的文件结构
|
||||
|
||||
便携版首次运行后会自解压,生成以下目录结构:
|
||||
|
||||
```
|
||||
你的文件夹/
|
||||
├── FFI-NAPI-App Portable x64 1.0.0.exe # 主程序
|
||||
└── (首次运行后自动生成)
|
||||
├── resources/
|
||||
│ ├── app/ # 应用源码目录(可编辑)
|
||||
│ │ ├── main.js # 主进程文件
|
||||
│ │ ├── index.html # 界面文件
|
||||
│ │ ├── test.js # 业务逻辑文件
|
||||
│ │ └── package.json # 配置文件
|
||||
│ ├── exe/ # 外部可执行文件目录
|
||||
│ │ └── Test.exe
|
||||
│ └── electron.asar # Electron 核心(不可编辑)
|
||||
└── ...其他 Electron 文件
|
||||
```
|
||||
|
||||
### 便携版的优势
|
||||
|
||||
1. **源码可见**:所有 JavaScript 文件都在 `resources/app/` 目录中,未加密
|
||||
2. **可以修改**:可以直接编辑 `resources/app/main.js` 等文件来调整功能
|
||||
3. **便于调试**:出现问题时可以直接查看和修改源码
|
||||
4. **无需重新打包**:小的修改可以直接编辑文件,无需重新打包
|
||||
|
||||
### 部署到其他电脑
|
||||
|
||||
直接复制整个文件夹到目标电脑即可,包括:
|
||||
- 主 `.exe` 文件
|
||||
- 首次运行后生成的所有文件和文件夹
|
||||
|
||||
### 修改便携版代码
|
||||
|
||||
1. 运行一次便携版程序(会自解压)
|
||||
2. 找到 `resources/app/` 目录
|
||||
3. 用文本编辑器打开需要修改的文件(如 `main.js`)
|
||||
4. 保存修改
|
||||
5. 重新启动程序即可看到更改效果
|
||||
|
||||
### 测试便携版
|
||||
|
||||
```bash
|
||||
.\test-portable.bat
|
||||
```
|
||||
|
||||
此脚本会:
|
||||
- 模拟便携版部署
|
||||
- 自动复制 exe 文件夹
|
||||
- 启动程序进行测试
|
||||
|
||||
## 输出文件
|
||||
|
||||
打包完成后,便携版程序将生成在 `dist` 目录中:
|
||||
|
||||
- 32位: `FFI-NAPI-App-Portable-ia32-1.0.0.exe`
|
||||
- 64位: `FFI-NAPI-App-Portable-x64-1.0.0.exe`
|
||||
|
||||
便携版特点:
|
||||
- 无需安装,双击即可运行
|
||||
- 首次运行会自解压所有文件
|
||||
- 源码保存在 `resources/app` 目录,可以直接修改
|
||||
- 配置文件保存在程序同目录
|
||||
- 可以放在 U 盘中使用
|
||||
|
||||
## 路径说明
|
||||
|
||||
### 开发环境
|
||||
- 应用文件: `项目根目录/main.js`
|
||||
- exe 文件路径: `项目根目录/exe/Test.exe`
|
||||
|
||||
### 打包后(便携版运行时)
|
||||
- 应用文件: `resources/app/main.js`(可编辑)
|
||||
- exe 文件路径: `resources/exe/Test.exe`
|
||||
|
||||
**重要:** 便携版不需要编辑任何代码就能正常运行,但如果需要修改,可以直接编辑 `resources/app/` 下的文件。
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 为什么选择不使用 asar 打包?
|
||||
|
||||
A:
|
||||
- **便于修改**:用户可以直接修改代码,无需重新打包
|
||||
- **易于调试**:出现问题时可以直接查看源码
|
||||
- **透明化**:所有代码都是可见的,用户可以了解程序的工作原理
|
||||
|
||||
### Q: 如何修改便携版的代码?
|
||||
|
||||
A:
|
||||
1. 首次运行便携版程序,让它自解压
|
||||
2. 找到程序目录下的 `resources/app/` 文件夹
|
||||
3. 用任何文本编辑器(记事本、VS Code 等)打开要修改的文件
|
||||
4. 保存后重启程序即可
|
||||
|
||||
### Q: 修改代码后需要重新打包吗?
|
||||
|
||||
A: 不需要。因为代码没有打包进 asar,所以可以直接修改 `resources/app/` 下的文件。
|
||||
|
||||
### Q: 便携版的安全性如何?
|
||||
|
||||
A: 源码是明文的,任何人都可以查看和修改。如果需要保护代码,可以:
|
||||
1. 将 `asar: false` 改为 `asar: true`
|
||||
2. 使用代码混淆工具
|
||||
3. 使用加密方案
|
||||
|
||||
### Q: 如何在便携版中调试?
|
||||
|
||||
A:
|
||||
1. 编辑 `resources/app/main.js`
|
||||
2. 找到 `webPreferences` 配置
|
||||
3. 确保包含 `nodeIntegration: true` 和 `contextIsolation: false`
|
||||
4. 取消注释 `mainWindow.webContents.openDevTools()` 来打开开发者工具
|
||||
|
||||
## 目录结构
|
||||
|
||||
### 打包前(项目目录)
|
||||
```
|
||||
ffi-napi/
|
||||
├── main.js # Electron 主进程
|
||||
├── index.html # 应用界面
|
||||
├── test.js # FFI 调用模块
|
||||
├── package.json # 项目配置
|
||||
├── electron-builder.yml # 构建配置(asar: false)
|
||||
├── build/ # 构建资源目录
|
||||
│ └── icon.ico # 应用图标
|
||||
├── exe/ # 可执行文件目录
|
||||
│ └── Test.exe
|
||||
└── dist/ # 打包输出目录
|
||||
```
|
||||
|
||||
### 打包后(便携版运行后)
|
||||
```
|
||||
程序目录/
|
||||
├── FFI-NAPI-App Portable x64 1.0.0.exe
|
||||
├── resources/
|
||||
│ ├── app/ # 应用源码(可编辑)
|
||||
│ │ ├── main.js # 可以用记事本打开修改
|
||||
│ │ ├── index.html
|
||||
│ │ ├── test.js
|
||||
│ │ └── package.json
|
||||
│ ├── exe/ # 外部程序
|
||||
│ │ └── Test.exe
|
||||
│ └── electron.asar # Electron 核心
|
||||
├── locales/
|
||||
└── ...其他文件
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 源码在 `resources/app/` 目录中是明文的,可以直接编辑
|
||||
- 修改代码后无需重新打包,重启程序即可
|
||||
- 如果需要保护代码,请修改 `electron-builder.yml` 中的 `asar: false` 为 `asar: true`
|
||||
- 32位程序可以在64位系统上运行
|
||||
- 64位程序只能在64位系统上运行
|
||||
- 图标文件必须是标准的 `.ico` 格式
|
||||
- Windows 会缓存图标,更换图标后需要清理缓存
|
||||
BIN
build/icon.ico
Normal file
BIN
build/icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 264 KiB |
43
clean-build.bat
Normal file
43
clean-build.bat
Normal file
@@ -0,0 +1,43 @@
|
||||
@echo off
|
||||
REM filepath: /c:/Users/Administrator/Desktop/ffi-napi/clean-build.bat
|
||||
echo ========================================
|
||||
echo 清理构建文件
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
echo 步骤 1: 结束可能占用文件的进程...
|
||||
taskkill /F /IM "FFI-NAPI App.exe" 2>nul
|
||||
taskkill /F /IM electron.exe 2>nul
|
||||
timeout /t 2 /nobreak >nul
|
||||
|
||||
echo.
|
||||
echo 步骤 2: 删除 dist 目录...
|
||||
if exist dist (
|
||||
echo 正在删除 dist 文件夹...
|
||||
rmdir /s /q dist 2>nul
|
||||
if exist dist (
|
||||
echo 第一次删除失败,等待 3 秒后重试...
|
||||
timeout /t 3 /nobreak >nul
|
||||
rmdir /s /q dist 2>nul
|
||||
)
|
||||
)
|
||||
|
||||
if exist dist (
|
||||
echo 警告: dist 目录仍然存在,可能有文件被占用
|
||||
echo 请手动关闭所有相关程序后重试
|
||||
pause
|
||||
exit /b 1
|
||||
) else (
|
||||
echo dist 目录清理成功!
|
||||
)
|
||||
|
||||
echo.
|
||||
echo 步骤 3: 删除临时文件...
|
||||
if exist node_modules\.cache rmdir /s /q node_modules\.cache 2>nul
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 清理完成!现在可以重新构建
|
||||
echo ========================================
|
||||
echo.
|
||||
pause
|
||||
39
electron-builder-32.yml
Normal file
39
electron-builder-32.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
appId: com.ffi.napi.app
|
||||
productName: FFI-NAPI App
|
||||
directories:
|
||||
output: dist/32bit
|
||||
buildResources: build
|
||||
|
||||
win:
|
||||
target:
|
||||
- target: nsis
|
||||
arch:
|
||||
- ia32
|
||||
icon: build/icon.ico
|
||||
|
||||
nsis:
|
||||
oneClick: false
|
||||
allowToChangeInstallationDirectory: true
|
||||
perMachine: true
|
||||
createDesktopShortcut: always
|
||||
createStartMenuShortcut: true
|
||||
shortcutName: FFI-NAPI App
|
||||
artifactName: "${productName}-Setup-Win32-${version}.${ext}"
|
||||
|
||||
files:
|
||||
- "main.js"
|
||||
- "index.html"
|
||||
- "test.js"
|
||||
- "package.json"
|
||||
- "exe/**/*"
|
||||
- "!node_modules/**/*"
|
||||
- "!dist/**/*"
|
||||
- "!.git/**/*"
|
||||
- "!*.log"
|
||||
|
||||
asar: true
|
||||
|
||||
extraResources:
|
||||
- from: "exe"
|
||||
to: "exe"
|
||||
filter: "**/*"
|
||||
39
electron-builder-64.yml
Normal file
39
electron-builder-64.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
appId: com.ffi.napi.app
|
||||
productName: FFI-NAPI App
|
||||
directories:
|
||||
output: dist/64bit
|
||||
buildResources: build
|
||||
|
||||
win:
|
||||
target:
|
||||
- target: nsis
|
||||
arch:
|
||||
- x64
|
||||
icon: build/icon.ico
|
||||
|
||||
nsis:
|
||||
oneClick: false
|
||||
allowToChangeInstallationDirectory: true
|
||||
perMachine: true
|
||||
createDesktopShortcut: always
|
||||
createStartMenuShortcut: true
|
||||
shortcutName: FFI-NAPI App
|
||||
artifactName: "${productName}-Setup-Win64-${version}.${ext}"
|
||||
|
||||
files:
|
||||
- "main.js"
|
||||
- "index.html"
|
||||
- "test.js"
|
||||
- "package.json"
|
||||
- "exe/**/*"
|
||||
- "!node_modules/**/*"
|
||||
- "!dist/**/*"
|
||||
- "!.git/**/*"
|
||||
- "!*.log"
|
||||
|
||||
asar: true
|
||||
|
||||
extraResources:
|
||||
- from: "exe"
|
||||
to: "exe"
|
||||
filter: "**/*"
|
||||
39
electron-builder.yml
Normal file
39
electron-builder.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
appId: com.ffi.napi.app
|
||||
productName: FFI-NAPI-App
|
||||
directories:
|
||||
output: dist
|
||||
buildResources: build
|
||||
|
||||
win:
|
||||
target:
|
||||
- target: portable
|
||||
arch:
|
||||
- ia32
|
||||
- x64
|
||||
icon: build/icon.ico
|
||||
requestedExecutionLevel: asInvoker
|
||||
|
||||
portable:
|
||||
artifactName: "${productName}-Portable-${arch}-${version}.${ext}"
|
||||
|
||||
files:
|
||||
- "main.js"
|
||||
- "index.html"
|
||||
- "test.js"
|
||||
- "package.json"
|
||||
- "!node_modules/**/*"
|
||||
- "!dist/**/*"
|
||||
- "!.git/**/*"
|
||||
- "!*.log"
|
||||
- "!*.bat"
|
||||
- "!*.md"
|
||||
- "!build/**/*"
|
||||
|
||||
asar: false
|
||||
|
||||
extraResources:
|
||||
- from: "exe"
|
||||
to: "exe"
|
||||
filter: "**/*"
|
||||
- from: "build/icon.ico"
|
||||
to: "build/icon.ico"
|
||||
3
exe/Data/20250813174610.pub
Normal file
3
exe/Data/20250813174610.pub
Normal file
@@ -0,0 +1,3 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveeb/uEn1ufFqHj7A2zyPQd0ugm5+H321vOrT/yHBXcziqH124Dwpqet4+S/b/JB+jSR8IFAwzoLWGUNRHOuipbf1cPj8eO7EYjyubRXLle296Zf+9K3bQTTm4qnN4mlE+rv35obbKjhcAA8QicASLLU6CzjUtiyWuC9i4fGNUD1jZC7GhDY9Fty7p1KhhMpzDAr1nfRL3UjdCiVOPZ/0R6PYLLATVcsGLUCklnVctwlxxHY9Z00NrBXctMe6ryDcnQ20KAbrnTQwr1IgxVCj6j/HdM9LsllDSBQHDaPIfv5A4VSj/IOVqnZdlua/LIOMLyx9mSUsoPDHSeUbkXV1QIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
BIN
exe/Obosky.LicenseCore.pdb
Normal file
BIN
exe/Obosky.LicenseCore.pdb
Normal file
Binary file not shown.
BIN
exe/Obosky.Licensing.Console.exe
Normal file
BIN
exe/Obosky.Licensing.Console.exe
Normal file
Binary file not shown.
BIN
exe/Obosky.Licensing.Console.pdb
Normal file
BIN
exe/Obosky.Licensing.Console.pdb
Normal file
Binary file not shown.
74
index.html
Normal file
74
index.html
Normal file
@@ -0,0 +1,74 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>FFI-NAPI App</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
padding: 20px;
|
||||
background: #f0f0f0;
|
||||
}
|
||||
.container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
background: white;
|
||||
padding: 30px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||
}
|
||||
button {
|
||||
padding: 10px 20px;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
background: #007acc;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
}
|
||||
button:hover {
|
||||
background: #005a9e;
|
||||
}
|
||||
#result {
|
||||
margin-top: 20px;
|
||||
padding: 10px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 4px;
|
||||
min-height: 100px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>FFI-NAPI Application</h1>
|
||||
<button onclick="checkAuth()">检查授权</button>
|
||||
<pre id="result"></pre>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const { remote, app } = require('electron');
|
||||
const { checkAuthorizationSync } = require('./test.js');
|
||||
const path = require('path');
|
||||
|
||||
function checkAuth() {
|
||||
try {
|
||||
// 获取资源路径
|
||||
const currentApp = remote ? remote.app : require('electron').app;
|
||||
const resourcePath = currentApp.isPackaged
|
||||
? path.join(process.resourcesPath, 'exe')
|
||||
: path.join(process.cwd(), 'exe');
|
||||
|
||||
const exePath = path.join(resourcePath, 'Test.exe');
|
||||
const command = `"${exePath}" 10303 "${resourcePath}"`;
|
||||
|
||||
console.log('执行命令:', command);
|
||||
const result = checkAuthorizationSync(command);
|
||||
document.getElementById('result').textContent = JSON.stringify(result, null, 2);
|
||||
} catch (error) {
|
||||
document.getElementById('result').textContent = '错误: ' + error.message;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
18
install-electron.bat
Normal file
18
install-electron.bat
Normal file
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
REM filepath: /c:/Users/Administrator/Desktop/ffi-napi/install-electron.bat
|
||||
echo 正在配置国内镜像源...
|
||||
|
||||
npm config set registry https://registry.npmmirror.com
|
||||
npm config set electron_mirror https://npmmirror.com/mirrors/electron/
|
||||
npm config set electron_builder_binaries_mirror https://npmmirror.com/mirrors/electron-builder-binaries/
|
||||
|
||||
echo 正在清理缓存...
|
||||
npm cache clean --force
|
||||
|
||||
echo 正在删除 node_modules...
|
||||
if exist node_modules rmdir /s /q node_modules
|
||||
|
||||
echo 正在安装依赖...
|
||||
npm install
|
||||
|
||||
pause
|
||||
20
install-with-cnpm.bat
Normal file
20
install-with-cnpm.bat
Normal file
@@ -0,0 +1,20 @@
|
||||
@echo off
|
||||
REM filepath: /c:/Users/Administrator/Desktop/ffi-napi/install-with-cnpm.bat
|
||||
echo 使用 cnpm 安装依赖...
|
||||
echo.
|
||||
|
||||
echo 步骤 1: 安装 cnpm...
|
||||
call npm install -g cnpm --registry=https://registry.npmmirror.com
|
||||
|
||||
echo.
|
||||
echo 步骤 2: 清理旧文件...
|
||||
if exist node_modules rmdir /s /q node_modules
|
||||
if exist package-lock.json del /f /q package-lock.json
|
||||
|
||||
echo.
|
||||
echo 步骤 3: 使用 cnpm 安装依赖...
|
||||
call cnpm install
|
||||
|
||||
echo.
|
||||
echo 安装完成!
|
||||
pause
|
||||
57
main.js
Normal file
57
main.js
Normal file
@@ -0,0 +1,57 @@
|
||||
const { app, BrowserWindow } = require('electron');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
let mainWindow;
|
||||
|
||||
function createWindow() {
|
||||
// 简化图标路径:直接从 app 目录下的 build 文件夹获取
|
||||
const iconPath = path.join(__dirname, 'build', 'icon.ico');
|
||||
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 1200,
|
||||
height: 800,
|
||||
icon: fs.existsSync(iconPath) ? iconPath : undefined,
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false,
|
||||
enableRemoteModule: true
|
||||
}
|
||||
});
|
||||
|
||||
mainWindow.loadFile('index.html');
|
||||
|
||||
// 开发模式下打开开发者工具
|
||||
if (!app.isPackaged || process.env.NODE_ENV === 'development') {
|
||||
mainWindow.webContents.openDevTools();
|
||||
}
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = null;
|
||||
});
|
||||
|
||||
// 打印路径信息用于调试
|
||||
console.log('========================================');
|
||||
console.log('应用路径信息:');
|
||||
console.log('是否打包:', app.isPackaged);
|
||||
console.log('图标路径:', iconPath);
|
||||
console.log('图标存在:', fs.existsSync(iconPath));
|
||||
console.log('当前目录:', __dirname);
|
||||
console.log('========================================');
|
||||
}
|
||||
|
||||
app.whenReady().then(() => {
|
||||
createWindow();
|
||||
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) {
|
||||
createWindow();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit();
|
||||
}
|
||||
});
|
||||
4131
package-lock.json
generated
Normal file
4131
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
package.json
Normal file
20
package.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "ffi-napi-app",
|
||||
"version": "1.0.0",
|
||||
"description": "FFI-NAPI Electron Application",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"build:32": "electron-builder --win portable --ia32",
|
||||
"build:64": "electron-builder --win portable --x64",
|
||||
"build": "npm run build:32 && npm run build:64",
|
||||
"postinstall": "electron-builder install-app-deps"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"electron": "^20.3.12",
|
||||
"electron-builder": "^24.13.3"
|
||||
}
|
||||
}
|
||||
92
rebuild-with-icon-fix.bat
Normal file
92
rebuild-with-icon-fix.bat
Normal file
@@ -0,0 +1,92 @@
|
||||
@echo off
|
||||
REM filepath: /C:/Users/Administrator/Desktop/ffi-napi/rebuild-with-icon-fix.bat
|
||||
echo ========================================
|
||||
echo 完整重新打包(修复图标)
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
REM 1. 检查图标
|
||||
echo 步骤 1/6: 检查图标文件...
|
||||
if not exist "build\icon.ico" (
|
||||
echo [错误] 找不到 build\icon.ico
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo [OK] 图标文件存在
|
||||
echo.
|
||||
|
||||
REM 2. 结束所有相关进程
|
||||
echo 步骤 2/6: 结束相关进程...
|
||||
taskkill /F /IM "FFI-NAPI-App*.exe" 2>nul
|
||||
taskkill /F /IM electron.exe 2>nul
|
||||
timeout /t 2 /nobreak >nul
|
||||
echo [OK] 进程已结束
|
||||
echo.
|
||||
|
||||
REM 3. 清理构建目录
|
||||
echo 步骤 3/6: 清理旧的构建文件...
|
||||
if exist dist (
|
||||
rmdir /s /q dist
|
||||
timeout /t 1 /nobreak >nul
|
||||
)
|
||||
if exist node_modules\.cache (
|
||||
rmdir /s /q node_modules\.cache
|
||||
)
|
||||
echo [OK] 构建目录已清理
|
||||
echo.
|
||||
|
||||
REM 4. 清理 Windows 图标缓存
|
||||
echo 步骤 4/6: 清理 Windows 图标缓存...
|
||||
echo 正在结束资源管理器...
|
||||
taskkill /f /im explorer.exe 2>nul
|
||||
timeout /t 1 /nobreak >nul
|
||||
|
||||
cd /d %userprofile%\AppData\Local\Microsoft\Windows\Explorer
|
||||
attrib -h IconCache.db 2>nul
|
||||
del IconCache.db /f /q 2>nul
|
||||
attrib -h iconcache_*.db 2>nul
|
||||
del iconcache_*.db /f /q 2>nul
|
||||
|
||||
cd /d %~dp0
|
||||
start explorer.exe
|
||||
timeout /t 2 /nobreak >nul
|
||||
echo [OK] 图标缓存已清理
|
||||
echo.
|
||||
|
||||
REM 5. 打包 32 位
|
||||
echo 步骤 5/6: 打包 32 位版本...
|
||||
echo ========================================
|
||||
call npm run build:32
|
||||
if errorlevel 1 (
|
||||
echo [错误] 32位打包失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo [OK] 32位打包完成
|
||||
echo.
|
||||
|
||||
REM 6. 打包 64 位
|
||||
echo 步骤 6/6: 打包 64 位版本...
|
||||
echo ========================================
|
||||
call npm run build:64
|
||||
if errorlevel 1 (
|
||||
echo [错误] 64位打包失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo [OK] 64位打包完成
|
||||
echo.
|
||||
|
||||
echo ========================================
|
||||
echo 所有版本打包完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 输出文件:
|
||||
dir dist\*.exe /b
|
||||
echo.
|
||||
echo 注意:如果图标仍未更新,请:
|
||||
echo 1. 重启电脑
|
||||
echo 2. 删除旧的 exe 文件
|
||||
echo 3. 重新运行此脚本
|
||||
echo.
|
||||
pause
|
||||
0
test-icon.js
Normal file
0
test-icon.js
Normal file
33
test.js
Normal file
33
test.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const { execSync } = require('child_process');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* 同步方式调用控制台程序并判断授权
|
||||
* @param {string} command - 要执行的命令
|
||||
* @returns {object} - 授权结果
|
||||
*/
|
||||
function checkAuthorizationSync(command) {
|
||||
try {
|
||||
const output = execSync(command, {
|
||||
encoding: 'utf-8',
|
||||
timeout: 10000 // 10秒超时
|
||||
});
|
||||
|
||||
console.log('授权查询结果:', JSON.parse(output));
|
||||
return JSON.parse(output);
|
||||
|
||||
} catch (error) {
|
||||
console.error('执行失败:', error);
|
||||
return { error: error.message, authorized: false };
|
||||
}
|
||||
}
|
||||
|
||||
// 使用示例
|
||||
if (require.main === module) {
|
||||
const exeDir = path.join(process.cwd(), 'exe');
|
||||
const syncResult = checkAuthorizationSync(`.\\exe\\Test.exe 10303 ${exeDir}`);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
checkAuthorizationSync,
|
||||
};
|
||||
42
verify-icon.js
Normal file
42
verify-icon.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
console.log('========================================');
|
||||
console.log('验证图标文件');
|
||||
console.log('========================================\n');
|
||||
|
||||
const iconPath = path.join(__dirname, 'build', 'icon.ico');
|
||||
|
||||
// 检查文件是否存在
|
||||
if (!fs.existsSync(iconPath)) {
|
||||
console.error('[错误] 图标文件不存在:', iconPath);
|
||||
console.log('\n请确保:');
|
||||
console.log('1. build 文件夹存在');
|
||||
console.log('2. icon.ico 文件在 build 文件夹中');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// 获取文件信息
|
||||
const stats = fs.statSync(iconPath);
|
||||
console.log('[OK] 图标文件存在');
|
||||
console.log('路径:', iconPath);
|
||||
console.log('大小:', stats.size, '字节');
|
||||
|
||||
// 检查文件内容(ICO 文件头)
|
||||
const buffer = Buffer.alloc(4);
|
||||
const fd = fs.openSync(iconPath, 'r');
|
||||
fs.readSync(fd, buffer, 0, 4, 0);
|
||||
fs.closeSync(fd);
|
||||
|
||||
// ICO 文件头应该是 00 00 01 00
|
||||
if (buffer[0] === 0x00 && buffer[1] === 0x00 &&
|
||||
buffer[2] === 0x01 && buffer[3] === 0x00) {
|
||||
console.log('[OK] 文件格式正确(ICO)');
|
||||
} else {
|
||||
console.error('[警告] 文件可能不是标准的 ICO 格式');
|
||||
console.log('文件头:', buffer.toString('hex'));
|
||||
}
|
||||
|
||||
console.log('\n========================================');
|
||||
console.log('验证完成!');
|
||||
console.log('========================================');
|
||||
Reference in New Issue
Block a user