【发布时间】:2023-03-16 10:18:01
【问题描述】:
请看 cmets inline
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;
}
}
}
【问题讨论】:
-
投射到 LPWSTR 是从不正确的。如果必须,请使用 DocumentPropertiesA()。
-
第二次调用 DocumentProperties() 真的失败了吗?在这种情况下,返回小于 0 的值表示失败。如果没有失败,则 GetLastError() 的值没有意义。
-
@Hans Passant m_currPrinterName 是 std::wstring,我认为这样转换是安全的。
-
@Luke 第二次调用 DocumentProperties() 确实返回 1。我还在第二次调用 DocumentProperties() 之前调用了 GetLastError()。 GetLastError() 在调用 DocumentProperties() 之前返回 0,但在调用 DocumentProperties() 之后返回 122。
-
仅在函数返回失败时调用 GetLastError()。如果你不需要,就不要强制转换,这会让阅读你代码的人感到困惑。
标签: c++ windows printing getlasterror