请看内嵌评论
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() 返回错误)。
关于c++ - 调用DocumentProperties时缓冲区不足,全局解锁也不会解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806957/