2017-10-07 54 views
-2

我正在使用函數SystemParametersInfo來獲取桌面壁紙,並且假定在向該函數添加動作SPI_GETDESKWALLPAPER時返回一個字符串。'SystemParametersInfo'函數在獲取桌面壁紙時返回不正確的值

LPWSTR bgPath; 
if(!SystemParametersInfo(SPI_GETDESKWALLPAPER, 0, bgPath, SPIF_UPDATEINIFILE)){ 
    qDebug() << *bgPath; 
    return; 
} 
qDebug()<< "an error occurred"; 

問題是函數返回一個數值(例如:50121)而不是字符串。
我的代碼有問題嗎?

+2

它不明白你爲什麼會寫這樣的代碼。就好像你沒有閱讀文檔。它說以下內容:*檢索桌面壁紙的位圖文件的完整路徑。 pvParam參數必須指向緩衝區以接收以空字符結尾的路徑字符串。將uiParam參數設置爲pvParam緩衝區的大小(以字符爲單位)。返回的字符串不會超過MAX_PATH個字符。如果沒有桌面牆紙,則返回的字符串爲空。* –

+1

因此,您得到的兩個參數都是錯誤的,而且文件Al參數也是錯誤的。除此之外,你不正確地處理返回值。 –

+1

是的,你應該使用WCHAR [],以便它可以將文件的名稱寫入緩衝區。並傳遞數組的大小,使其不能寫得太多。並修復if()語句,您已經注意到它返回FALSE來指示失敗。並且使用GetLastError()來找出失敗的原因,發現爲什麼winapi函數調用不起作用總是很重要。 –

回答

2

你不按照SPI_GETDESKTOPWALLPAPER文件分配任何內存bgPathSystemParametersInfo()填寫

pvParam參數必須指向一個緩衝區來接收空終止路徑字符串。將uiParam參數設置爲pvParam緩衝區的大小(以字符爲單位)。返回的字符串不會超過MAX_PATH個字符。

即使您正在分配一個緩衝區,您也檢查返回值SystemParametersInfo()的失敗而不是成功。而且,您正在取消引用您的字符串指針,所以最多隻輸出第一個字符,而不是整個字符串。

使用這個代替:

WCHAR bgPath[MAX_PATH]; 

if (SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, bgPath, 0)) 
{ 
    qDebug() << bgPath; 
    return; 
} 
qDebug() << "an error occurred"; 
+0

我感謝你的回答。不幸的是,該函數返回一個地址(例如:0x28c1c0)。 –

+0

@LionKing的'qDebug()'接受Unicode字符串開始?還是隻有ANSI字符串?如果是後者,則使用'WideCharToMultiByte()'將'bgPath'轉換爲ANSI,或將'SystemParametersInfoA()'與'char []'緩衝區一起使用 –

+1

@LionKing:由於QDebug沒有'operator <<'重載'取一個'const wchar_t *',lookup將匹配泛型指針重載,而不是'const void *'。這將輸出指針值。如果你想轉儲一個寬字符串,你將不得不首先構造一個'QString':'qDebug()<< QString(bgPath);'。 – IInspectable