调用DocumentProperties时缓冲区不足,同时,全局解锁也不会解锁怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)
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;
        }           
    }
}
提问于
用户回答回答于

将GPTR传递给GlobalAlloc后无需调用GlobalLock。只需在传递GMEM_MOVEABLE时调用GlobalLock。

不应该使用GlobalAlloc / GlobalFree,除非传递内存的API的文档中有其他说明。

用户回答回答于

在某些情况下,DocumentProperties将返回-1来表示某些机器的DEVMODE大小 - MS论坛上有关于它的一个完整的线程(开始于2008年),但MS不认为它是一个问题,尽管它们的示例代码从未检查返回代码(或PrintDlg()通用对话框,它愉快地尝试分配-1内存并失败)。

你不能完全依赖这个功能,因为它可以在你的机器上工作,但在客户机上失败。检查-1,如果它返回只是组成一个大数字(2 * sizeof(DEVMODE)或其他东西)并使用它。

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问4 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券