2017-07-02 295 views
0

我有一個簡單的問題,我似乎無法澄清,儘管我研究了堆棧溢出及其他問題。我的問題涉及Windows SystemParametersInfo函數及其變體SystemParametersInfoW(Unicode)和SystemParametersInfoA(ANSI)與Python 3.x腳本的關係。Python - Windows SystemParametersInfoW與SystemParametersInfoA函數之間的區別函數

在我寫的Python腳本中,我遇到了兩種不同的解釋,說明何時使用這些變體。 This answer to a question表示對於64位機器,您必須使用SystemParametersInfoW,而對於32位機器,您必須使用SystemParametersInfoA,因此您應該運行一個函數以確定腳本運行在哪臺位機上。然而,another answer here(我已經看到更多人主張這種類型的答案)和here說SystemParametersInfoW 必須與Python 3.x一起使用,因爲它傳遞一個Unicode字符串,而SystemParametersInfoA用於Python 2.x及更低版本因爲它傳遞了一個有利於ANSI的字節串。

那麼什麼是正確的答案,因爲我需要用我的腳本以不同的方式繼續前進?同樣,我使用的是Python 3.5,所以第二個答案是合適的,但是在使用SystemParametersInfoW和SystemParametersInfoA之間的機器位是否有任何事實?它是兩種答案的混合物,還是應該繼續使用SystemParametersInfoW,而不管它是否將用於32位或64位計算機上?我甚至需要確定腳本運行的機器的位數?感謝您對澄清此問題的幫助!

+1

32位/ 64位的事情是胡說八道。如果您的編程語言支持Unicode字符串,請繼續並使用Unicode版本 - 您無需擔心所運行的Windows版本。 (當然,除非你需要支持Windows 95/98/ME,或16位Windows,我想。不可思議的事現在!) –

+1

文件/註冊表名稱,窗口的文本,用戶名等都是Unicode的。通過ANSI API可以爲您的語言環境代碼頁提供一種不值錢的有損翻譯。讓代碼頁死掉,並用MS-DOS和Windows 9.x(其核心基本上是一個32位DOS擴展器)將它們埋葬。這些舊系統上沒有支持的Python構建版本。無論何時調用WinAPI函數,Python 2的用戶都應該使用'unicode'字符串,這不幸在Unix和Windows代碼之間形成楔形,但這僅僅是跨平臺代碼的一個難題。 – eryksun

回答

1

在內部,Windows使用Unicode。 SystemParametersInfoA函數將ANSI參數字符串轉換爲Unicode,並在內部調用SystemParametersInfoW。你可以在Python 2.x或3.x中使用Python或32位或64位調用。通常你想讓W版本通過並檢索Unicode字符串,因爲Windows是內部Unicode的。 A版本可能會丟失信息。

可用於Python 2或3,32或64位的示例。請注意,W版本在緩衝區中返回一個Unicode字符串,而A版本返回一個字節字符串。

from __future__ import print_function 
from ctypes import * 
import sys 

print(sys.version) 
SPI_GETDESKWALLPAPER = 0x0073 
dll = WinDLL('user32') 
buf = create_string_buffer(200) 
ubuf = create_unicode_buffer(200) 
if dll.SystemParametersInfoA(SPI_GETDESKWALLPAPER,200,buf,0): 
    print(buf.value) 
if dll.SystemParametersInfoW(SPI_GETDESKWALLPAPER,200,ubuf,0): 
    print(ubuf.value) 

輸出(Python的2.X 32位和Python 3.X 64位):

C:\>py -2 test.py 
2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] 
c:\windows\web\wallpaper\theme1\img1.jpg 
c:\windows\web\wallpaper\theme1\img1.jpg 

C:\>py -3 test.py 
3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] 
b'c:\\windows\\web\\wallpaper\\theme1\\img1.jpg' 
c:\windows\web\wallpaper\theme1\img1.jpg 
+0

這是我的想法,但只是想確定。感謝您提供樣本輸出! –

2

在Windows 3.x/95/98/ME上,很可能只有SystemParametersInfoA正常工作。在所有其他系統上,無論操作系統的位數是多少,A和W都可以工作。

假設你只支持「近期」的Windows版本中,你應該只挑味道最適合您以自己的語言使用,這通常意味着,在你的語言的默認字符串類型相匹配的味道。

如果您要同時支持Python v2 & v3,那麼您將不得不在運行時選擇在使用默認字符串類型時調用哪個函數。

+0

我明白了。感謝您提醒我關於支持這兩個版本的Python的部分。自從我使用Python 3編寫代碼之後,這並沒有傳遞給我,但有些系統只有Python 2! –

相關問題