首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ system() 調用系統工具失敗:32/64 位元不匹配問題解決方案

     編輯:程式設計疑難解答

問題現象

程式以 32 位元模式編譯(Cocos2d-x 專案限制),呼叫 system("snippingtool") 或 system("osk") 等系統工具失敗,提示「不是內部或外部命令」。64 位元模式下正常。

根本原因

  • 32 位元進程預設存取 C:\Windows\SysWOW64,該目錄不包含部分僅有 64 位元版本的系統工具(如 snippingtool.exe, osk.exe)。
  • 64 位元進程存取 C:\Windows\System32,工具完整存在。

解決方案

方案一:明確指定 Sysnative 重導向路徑(僅 32 位元進程有效)

system("C:\\Windows\\Sysnative\\snippingtool.exe");

Sysnative 是 WoW64 提供的虛擬目錄,32 位元進程訪問時會自動重導向至真正的 64 位元 System32。

方案二:使用 ShellExecuteEx 指定 64 位元動詞

SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpVerb = "open";
sei.lpFile = "snippingtool.exe";
sei.nShow = SW_SHOW;
ShellExecuteEx(&sei);

Shell API 會自動處理架構匹配。

方案三:將專案編譯為 64 位元(若框架支援)

Cocos2d-x 3.17+ 已支援 64 位元,升級專案設定可從根本解決。

驗證方法

在命令提示字元執行 where snippingtool,確認 64 位元路徑存在;32 位元 cmd 執行 dir C:\Windows\Sysnative\snippingtool.exe 驗證重導向生效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved