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

3 に答える 3

1

DocumentProperties() への 2 番目の呼び出しが 1 (IDOK) を返す場合、失敗していないため、GetLastError() の値は無意味です。DocumentProperties() 内で発生して処理されるのは、おそらく予想される条件です。GetLastError() を使用する際の規則は、失敗した場合にのみ設定することです。通常、成功時にクリアすることはありません。エラーがどのように返されるかを説明するのは、個々の関数のドキュメント次第です。DocumentProperties() のドキュメントでは GetLastError() についても言及されていないため、チェックしても意味がない可能性があります (通常、すべての Win32 関数が GetLastError() を介してエラーを返すと想定しても問題ありません)。

于 2010-05-11T18:27:41.257 に答える
0

DocumentProperties は、特定の状況下で特定のマシンの DEVMODE サイズに対して -1 を返します。MS フォーラムにはそれに関するスレッド全体があります (2008 年頃に開始) が、サンプル コードが戻り値をチェックしていないにもかかわらず、MS はそれを問題とは見なしていません。コード (または喜んで -1 メモリを割り当てようとして失敗する PrintDlg() 共通ダイアログ)。

この機能だけに頼ることはできません。自分のマシンでは機能しても、クライアントのマシンでは失敗する可能性があるからです。-1 を確認し、それが大きな数値 (2*sizeof(DEVMODE) など) を構成することを返す場合は、それを使用します。

于 2012-05-30T10:23:11.887 に答える
0

GPTR を GlobalAlloc に渡したので、GlobalLock を呼び出す必要はありません。GMEM_MOVEABLE を渡すときにのみ GlobalLock を呼び出す必要があります。

ただし、メモリを渡す API のドキュメントに別段の記載がない限り、GlobalAlloc/GlobalFree を使用しないでください。HeapAlloc/HeapFree または単に new/delete を優先します。GlobalAlloc は、16 ビット Windows との互換性を目的とした古い API です。

于 2010-05-10T23:04:14.063 に答える