差異處
這裏顯示兩個版本的差異處。
下次修改 | 前次修改 | ||
windowsbatch:sysnative [2013/06/10 15:17] tony 建立 |
windowsbatch:sysnative [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 2: | 行 2: | ||
====== 找不到的msg.exe - 神奇的sysnative ====== | ====== 找不到的msg.exe - 神奇的sysnative ====== | ||
===== Problem ===== | ===== Problem ===== | ||
- | 某天遇到windows command - msg.exe在win7/win8找不到的問題。這問題乍看之下非常的神奇,兩套不同的軟體但一個能夠使用一個則不行。在不行的那個軟體中加入Debug訊息,卻出現msg.exe找不道的怪異現象。這兩套軟體除了一個是C++做的一個是Java做的外,另外一個特點是32-bit與64-bit的Service之差別。Command都一樣為什麼32-bit的卻不能用呢? | + | 某天遇到windows command - msg.exe在win7/win8找不到的問題。這問題乍看之下非常的神奇,兩套不同的軟體但一個能夠使用一個則不行。在不行的那個軟體中加入Debug訊息,卻出現msg.exe找不到的怪異現象。這兩套軟體除了實作語言不同外,另外一個是32與64 bit之差別。執行的Command一樣,但為什麼32-bit的卻不能用呢? |
===== Root Cause ===== | ===== Root Cause ===== | ||
首先我透過了32與64位元的cmd.exe去執行msg.exe: (system32 for 32-bit;syswow64 for 64-bit)\\ | 首先我透過了32與64位元的cmd.exe去執行msg.exe: (system32 for 32-bit;syswow64 for 64-bit)\\ | ||
行 8: | 行 8: | ||
可以發現在32位元的情況下根本找不到msg.exe,接著到C:/windows下搜尋msg.exe,確認system32與syswow64中是否都有msg.exe。事實是: 僅system32中有msg.exe。\\ | 可以發現在32位元的情況下根本找不到msg.exe,接著到C:/windows下搜尋msg.exe,確認system32與syswow64中是否都有msg.exe。事實是: 僅system32中有msg.exe。\\ | ||
{{:windowsbatch:search_msg_win7.png|}}\\ | {{:windowsbatch:search_msg_win7.png|}}\\ | ||
- | 這是系統限制,issue可以不解嗎? 但問題是另外一個軟體做的到阿! 把一個軟體從32變成64位元是較難些,還是看看要如何用較簡單的方式去解決這個問題吧! | + | 這是系統限制,issue可不解嗎? 但問題是另外一個軟體做的到阿! 把一個軟體從32變成64位元是較難些,還是看看要如何用較簡單的方式去解決這個問題吧! |
===== How to ? ===== | ===== How to ? ===== | ||
我試過**直接呼叫%windir%\system32\msg.exe**,也確認過**%PATH%有指到system32**,但事實上32-bit的service是無法直接存取system32的。還好這時候看到個一個叫**sysnative**的東西,它可以透過這個資料夾讓32的應用程式可以訪問到system32中的東西。\\ | 我試過**直接呼叫%windir%\system32\msg.exe**,也確認過**%PATH%有指到system32**,但事實上32-bit的service是無法直接存取system32的。還好這時候看到個一個叫**sysnative**的東西,它可以透過這個資料夾讓32的應用程式可以訪問到system32中的東西。\\ | ||
行 38: | 行 38: | ||
</code> | </code> | ||
==== C/C++ ==== | ==== C/C++ ==== | ||
- | 我寫了一個intMsgCommand的function,接收結果cmd與要發出的message參數。首先透過執行一次msg去確認exit code為0,如果不為0就用sysnative做法。這裡需注意的是: 如果採用batch中第二個做法是行不通的,因為在程式中判斷sysnative是否存在會得到false的結果。最後會把要執行的command給串到cmd參數中。 | + | 我寫了一個intMsgCommand的function,參數為接收結果cmd與要發出的message。首先透過執行一次msg去確認exit code為0,如果不為0就用sysnative做法。這裡需注意的是: 如果採用batch中第二個做法是行不通的,因為在應用程式中判斷sysnative是否存在,將會得到false的結果。最後會把要執行的command給串到cmd參數中。當然你也可以選擇將整串的batch給塞到system中執行,只是這樣的code可讀性非常差。 |
<code cpp> | <code cpp> | ||
void intMsgCommand(char* cmd, char *message){ | void intMsgCommand(char* cmd, char *message){ | ||
行 60: | 行 60: | ||
\\ | \\ | ||
===== ===== | ===== ===== | ||
- | 友藏內心獨白: 這問題其實有點鳥。 | + | 友藏內心獨白: 其實這問題有點鳥。 |
===== Reference ===== | ===== Reference ===== | ||
* [[http://leonax.net/p/2601/magic-of-sysnative-folder/|神奇的SysNative文件夹]] | * [[http://leonax.net/p/2601/magic-of-sysnative-folder/|神奇的SysNative文件夹]] |