2026-01-04 05:19:47 +05:00
|
|
|
fn main() {
|
|
|
|
|
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
|
|
|
|
|
let lib_path = std::path::Path::new(&manifest_dir)
|
|
|
|
|
.join("..\\..\\lib\\windows\\amd64");
|
fix(app): embed Common-Controls v6 manifest so TaskDialogIndirect resolves
Symptom: jarvis-app.exe failed to start with a MessageBox saying
"Точка входа в процедуру TaskDialogIndirect не найдена в библиотеке
DLL ... jarvis-app.exe". Loader phase, no log lines ever written.
Cause: tray-icon 0.21 / winit 0.30 transitive Win32 imports include
TaskDialogIndirect from comctl32.dll, which is a Common-Controls v6
API. Without a side-by-side manifest declaring a dependency on
Microsoft.Windows.Common-Controls v6.0.0.0, Windows loads the legacy
v5 comctl32 (which does not export TaskDialogIndirect) and the
loader rejects the exe before main().
jarvis-gui does not hit this because tauri-build embeds its own
manifest as part of the Tauri compile step. jarvis-app had no
manifest at all.
Fix:
- app.manifest: Common-Controls v6 dependency, supportedOS for
Win7..Win11, PerMonitorV2 DPI awareness, UTF-8 active code page,
asInvoker execution level.
- app.manifest.rc: 3-line .rc that embeds the manifest with
CREATEPROCESS_MANIFEST_RESOURCE_ID (1) and RT_MANIFEST (24).
- build.rs: on cfg(windows), embed_resource::compile() compiles the
.rc and links the resulting .res into the exe. rerun-if-changed
on the manifest sources.
- Cargo.toml: target-windows build-dependency on embed-resource 3.
Verified: jarvis-app.exe now runs cleanly through all init steps:
commands parsed, audio init, recorder init found "Микрофон (5-
Fifine Microphone)", IPC server up on ws://127.0.0.1:9712, VAD
already flushing frames.
UTF-8 active code page in the manifest also helps russian-character
fidelity when win32 APIs are invoked from PowerShell helpers.
2026-05-15 13:26:00 +03:00
|
|
|
|
2026-01-04 05:19:47 +05:00
|
|
|
println!("cargo:rustc-link-search=native={}", lib_path.display());
|
fix(app): embed Common-Controls v6 manifest so TaskDialogIndirect resolves
Symptom: jarvis-app.exe failed to start with a MessageBox saying
"Точка входа в процедуру TaskDialogIndirect не найдена в библиотеке
DLL ... jarvis-app.exe". Loader phase, no log lines ever written.
Cause: tray-icon 0.21 / winit 0.30 transitive Win32 imports include
TaskDialogIndirect from comctl32.dll, which is a Common-Controls v6
API. Without a side-by-side manifest declaring a dependency on
Microsoft.Windows.Common-Controls v6.0.0.0, Windows loads the legacy
v5 comctl32 (which does not export TaskDialogIndirect) and the
loader rejects the exe before main().
jarvis-gui does not hit this because tauri-build embeds its own
manifest as part of the Tauri compile step. jarvis-app had no
manifest at all.
Fix:
- app.manifest: Common-Controls v6 dependency, supportedOS for
Win7..Win11, PerMonitorV2 DPI awareness, UTF-8 active code page,
asInvoker execution level.
- app.manifest.rc: 3-line .rc that embeds the manifest with
CREATEPROCESS_MANIFEST_RESOURCE_ID (1) and RT_MANIFEST (24).
- build.rs: on cfg(windows), embed_resource::compile() compiles the
.rc and links the resulting .res into the exe. rerun-if-changed
on the manifest sources.
- Cargo.toml: target-windows build-dependency on embed-resource 3.
Verified: jarvis-app.exe now runs cleanly through all init steps:
commands parsed, audio init, recorder init found "Микрофон (5-
Fifine Microphone)", IPC server up on ws://127.0.0.1:9712, VAD
already flushing frames.
UTF-8 active code page in the manifest also helps russian-character
fidelity when win32 APIs are invoked from PowerShell helpers.
2026-05-15 13:26:00 +03:00
|
|
|
|
|
|
|
|
// Embed a Common-Controls v6 manifest on Windows so transitive imports
|
|
|
|
|
// pulled in by tray-icon / winit (TaskDialogIndirect, themed controls,
|
|
|
|
|
// per-monitor DPI) resolve against comctl32 v6. Without this the exe
|
|
|
|
|
// crashes at load with "TaskDialogIndirect entry point not found".
|
|
|
|
|
#[cfg(target_os = "windows")]
|
|
|
|
|
{
|
|
|
|
|
println!("cargo:rerun-if-changed=app.manifest");
|
|
|
|
|
println!("cargo:rerun-if-changed=app.manifest.rc");
|
|
|
|
|
let _ = embed_resource::compile("app.manifest.rc", embed_resource::NONE);
|
|
|
|
|
}
|
2026-01-04 05:19:47 +05:00
|
|
|
}
|