我有一個問題GetSystemMetrics(SM_CYSCREEN);——每次我運行程式時,這個函式回傳的高度都是隨機的,但是寬度函式GetSystemMetrics(SM_CXSCREEN);給出了正確的值。
這是我的代碼:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int MessageBoxPrintf(const wchar_t * szCaption, const wchar_t * szFormat, ...) {
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
wchar_t* c = va_arg(v1, wchar_t*);
wsprintf(buffer, szFormat, c); //gives formated output to buffer
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintf(TEXT("ScreenRes"), TEXT("The screen is %i pixels wide by %i pixels high"), cxScreen, cyScreen);
return 0;
}
這個程式基本上只是一個帶有 WinAPI 和 C 的格式字串訊息框。
uj5u.com熱心網友回復:
您發布的代碼顯示(幾乎可以肯定)未定義的行為,因為您在MessageBoxPrintf函式中處理可變引數串列的方式不正確。
在這一wchar_t* c = va_arg(v1, wchar_t*);行中,您“假設”了一個wchar_t引數——但是,在您的main函式中,您傳遞了兩個int引數。這可能會或不會產生有意義的結果;– 在您的情況下,似乎第一個int引數被后續呼叫正確解釋,wsprintf但第二個引數有點“在翻譯中丟失”(表現出上述未定義的行為)。
要正確處理該可變引數串列,您需要提取它,然后將其未經處理的傳遞給vswprintf函式,然后它可以正確解釋該引數串列:
int MessageBoxPrintf(const wchar_t* szCaption, const wchar_t* szFormat, ...)
{
wchar_t buffer[1024];
va_list v1;
va_start(v1, szFormat);
vswprintf(buffer, 1024, szFormat, v1);
va_end(v1);
return MessageBox(NULL, buffer, szCaption, 0);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/443101.html
上一篇:為什么我會遇到這個錯誤:在'arr'中請求成員'size',它是非型別別'int[n]'for(intj=arr.size()-1;j>
