c++ - 调用DocumentProperties时缓冲区不足,全局解锁也不会解锁

标签 c++ windows printing getlasterror

请看内嵌评论

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/

相关文章:

python-3.x - FakeRedis 异常 - FakeSocket 没有 fileno() 方法

c - 如何更改 C 中的加载程序

java - SWT:打印浏览器小部件内容

c++ - 如何在 Windows 上将 GoogleTest 变量 GTEST_LIBRARY GTEST_INCLUDE_DIR 和 GTEST_MAIN_LIBRARY 设置为 CMake?

c++ - vector<bool> 和数组之间的性能差距

windows - 使用提升的权限复制文件

c# - 使用 AsParallel() 时无法获取与 Windows 应用程序关联的文件的文件图标

css - 打印 CSS : Empty white space at top

c++ - 试图 Cout 函数的返回

c++ - 发生错误时在 if/else block 之间切换