請參閱評論直列足夠的緩衝區時調用DocumentProperties,也是全球解鎖也不會解鎖
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()。 – 2010-05-11 01:40:59
對DocumentProperties()的第二次調用實際上失敗了嗎?在這種情況下,通過返回一個小於0的值來表示失敗。如果它沒有失敗,那麼GetLastError()的值是沒有意義的。 – Luke 2010-05-11 03:10:13
@Hans Passant m_currPrinterName是std :: wstring,我認爲用這種方法進行投射是安全的。 – Quincy 2010-05-11 16:37:59