请查看内联评论
bool res = false;
DWORD dwNeeded = DocumentPropertiesW(NULL, m_currPrinterHandle, (LPWSTR) m_currPrinterName.c_str(), NULL, NULL, 0);
if (m_devmode_buf)
{
GlobalFree(m_devmode_buf);
}
m_devmode_buf = GlobalAlloc(GPTR, dwNeeded);
GetLastError(); // = 0;
if (m_devmode_buf)
{
LPDEVMODEW devmode_buf = (LPDEVMODEW) GlobalLock(m_devmode_buf);
GetLastError(); // = 0
if (devmode_buf)
{
if (devmode_buf)
{
lala = DocumentPropertiesW(NULL, m_currPrinterHandle, (LPWSTR) m_currPrinterName.c_str(), devmode_buf, NULL, DM_OUT_BUFFER);
if (lala == IDOK)
{
res = true;
}
GetLastError(); // = 122. insufficient buffer here. why????
}
UInt32 res1 = GlobalUnlock(m_devmode_buf); // res1 is 1. should be 0
res2 = GetLastError(); // = 0
if (!(res1 == 0 && (res2 == ERROR_NOT_LOCKED || res2 == NO_ERROR)))
{
//res = false;
}
}
}
最佳答案
如果对DocumentProperties()的第二次调用返回1(即IDOK),则它不会失败,因此GetLastError()的值没有意义。这可能是在DocumentProperties()内部引发和处理的预期条件。使用GetLastError()的约定是仅在失败时进行设置;您通常不会在成功时就清除它。由每个函数的文档来解释如何返回错误。 DocumentProperties()的文档甚至没有提到GetLastError(),因此对其进行检查可能毫无意义(尽管通常可以安全地假设所有Win32函数都通过GetLastError()返回错误)。