优化bug
This commit is contained in:
@@ -23,7 +23,9 @@ export async function openDesignApp(
|
||||
const target = path.resolve(exePath.trim())
|
||||
const err = await shell.openPath(target)
|
||||
if (err) {
|
||||
return { ok: false, message: err }
|
||||
// 用户在 UAC/系统弹窗中点击"否"或被系统拒绝时,shell.openPath 返回通用错误字符串
|
||||
// 不把原始 "Failed to Open Path" 直接抛给用户,给出可读说明
|
||||
return { ok: false, message: '打开设计软件失败,可能已被取消或需要管理员权限' }
|
||||
}
|
||||
return { ok: true }
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ let SAPI_Init: any = null
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let SAPI_GetPrinterInfo: any = null
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let SAPI_FreePrinterInfo: any = null
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let SAPI_GetPrinterErrorStr: any = null
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let SAPI_RestJobEx: any = null
|
||||
@@ -77,6 +79,20 @@ function traceCall<T>(name: string, args: Record<string, unknown> | undefined, f
|
||||
}
|
||||
}
|
||||
|
||||
function freePrinterInfoPtr(ptr: number): void {
|
||||
if (!ptr) return
|
||||
// DLL 堆分配的缓冲区必须用 DLL 导出的释放函数;koffi.free 会触发 STATUS_HEAP_CORRUPTION
|
||||
if (SAPI_FreePrinterInfo) {
|
||||
try {
|
||||
SAPI_FreePrinterInfo(ptr)
|
||||
} catch (e) {
|
||||
log.warn('SAPI_FreePrinterInfo failed', e)
|
||||
}
|
||||
return
|
||||
}
|
||||
log.warn('SAPI_FreePrinterInfo unavailable; printer info buffer not freed')
|
||||
}
|
||||
|
||||
function readPrinterJsonFromOutPtr(len: number, outPtr: Buffer): { code: number; json?: Record<string, unknown> } {
|
||||
if (len <= 0) return { code: len }
|
||||
const ptr = koffi.decode(outPtr, 0, 'void *') as number
|
||||
@@ -90,7 +106,7 @@ function readPrinterJsonFromOutPtr(len: number, outPtr: Buffer): { code: number;
|
||||
return { code: len }
|
||||
}
|
||||
} finally {
|
||||
koffi.free(ptr)
|
||||
freePrinterInfoPtr(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,6 +126,13 @@ function loadLibrary(): void {
|
||||
SAPI_GetUsbCopyState = lib.func('int __stdcall SAPI_GetUsbCopyState(_Out_ int *, _Out_ int *)')
|
||||
SAPI_PrinterResetprinter = lib.func('int __stdcall SAPI_PrinterResetprinter()')
|
||||
|
||||
try {
|
||||
SAPI_FreePrinterInfo = lib.func('void __stdcall SAPI_FreePrinterInfo(void *)')
|
||||
} catch {
|
||||
SAPI_FreePrinterInfo = null
|
||||
log.warn('SAPI_FreePrinterInfo not in workDll')
|
||||
}
|
||||
|
||||
try {
|
||||
SAPI_UploadFile = lib.func('int __stdcall SAPI_UploadFile(str, str, str)')
|
||||
hasUploadApi = true
|
||||
@@ -151,6 +174,15 @@ function loadLibrary(): void {
|
||||
emitTrace('[dll] SAPI_PrinterMovetousbreader not in workDll (optional)')
|
||||
}
|
||||
|
||||
try {
|
||||
SAPI_PrinterMovetohopper = lib.func('int __stdcall SAPI_PrinterMovetohopper()')
|
||||
hasHopperApi = true
|
||||
} catch {
|
||||
SAPI_PrinterMovetohopper = null
|
||||
hasHopperApi = false
|
||||
emitTrace('[dll] SAPI_PrinterMovetohopper not in workDll (optional)')
|
||||
}
|
||||
|
||||
try {
|
||||
SAPI_GetPrinterCardPosition = lib.func('int __stdcall SAPI_GetPrinterCardPosition(_Out_ int *)')
|
||||
hasCardPositionApi = true
|
||||
@@ -354,6 +386,14 @@ export function dllPrinterMoveToUsbReader(): number {
|
||||
})
|
||||
}
|
||||
|
||||
export function dllPrinterMoveToHopper(): number {
|
||||
return traceCall('SAPI_PrinterMovetohopper', undefined, () => {
|
||||
loadLibrary()
|
||||
if (!SAPI_PrinterMovetohopper) throw new Error('HOPPER_API_UNAVAILABLE')
|
||||
return SAPI_PrinterMovetohopper() as number
|
||||
})
|
||||
}
|
||||
|
||||
export function dllPrinterReject(): number {
|
||||
return traceCall('SAPI_PrinterMovetoreject', undefined, () => {
|
||||
loadLibrary()
|
||||
|
||||
Reference in New Issue
Block a user