首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调用DocumentProperties时缓冲区不足,而且全局解锁无法解锁

调用DocumentProperties时缓冲区不足,而且全局解锁无法解锁
EN

Stack Overflow用户
提问于 2010-05-11 06:46:22
回答 3查看 871关注 0票数 0

请参阅内联注释

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;
        }           
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-12 02:27:41

如果对DocumentProperties()的第二次调用返回1(即IDOK),则它不会失败,因此GetLastError()的值没有意义。这可能是在DocumentProperties()中引发和处理的预期条件。使用GetLastError()的惯例是,只在失败时设置它;在成功时通常不清除它。由每个单独函数的文档来解释如何返回错误。DocumentProperties()的文档甚至没有提到GetLastError(),所以检查它可能是毫无意义的(尽管通常可以安全地假设所有Win32函数都通过GetLastError()返回错误)。

票数 1
EN

Stack Overflow用户

发布于 2010-05-11 07:04:14

由于已将GPTR传递给GlobalAlloc,因此不需要调用GlobalLock。只需在传入GMEM_MOVEABLE时调用GlobalLock即可。

但是,您不应该使用GlobalAlloc/GlobalFree,除非您要将内存传递到的API的文档另有说明。首选HeapAlloc/HeapFree或仅使用new/delete。GlobalAlloc是一个较旧的应用程序接口,旨在与16位视窗兼容。

票数 0
EN

Stack Overflow用户

发布于 2012-05-30 18:23:12

在某些情况下,DocumentProperties会为某些机器的DEVMODE大小返回-1 - MS论坛上有一整条关于它的帖子(大约从2008年开始),但MS并不认为这是一个问题,尽管他们的示例代码从不检查返回代码(或者PrintDlg()公共对话框,它很高兴地尝试分配内存,但失败了)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2806957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档