1

次のコマンドが処理されるたびに、次の関数が IEXPLORER プロセス全体をブロックする理由を理解するのに本当に苦労しています。hwndOwner 変数に関連するものであるとほぼ確信しています。ntdll.dll のコールスタックを掘り下げているときです。私はこれらの2行に気付きました:

ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes  
ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes  

私の「知識に基づいた」推測の 1 つは、デッドロックが発生した可能性があるということですが、何が/誰が実際にそれを引き起こしたのかを理解するためのツールと知識を正確には持っていません。
トピックにあるように、OS 32 ビット win7 ベースでは、これは起こりません。その特定の hwnd を実際にロックし、デッドロックまたは事前ロックを引き起こした可能性があるコード内の行を見つけることができませんでした。

EXPORTFILENAME ofn;
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.hwndOwner       = m_hWnd;
        ofn.lStructSize     = sizeof(OPENFILENAME);
        ofn.Flags           = OFN_OVERWRITEPROMPT | OFN_ENABLESIZING | OFN_EXPLORER | OFN_NOREADONLYRETURN | ((DVDBURN == (eType & DVDBURN)) ? (/*OFN_OVERWRITEPROMPT |*/ /*OFN_ENABLEINCLUDENOTIFY |*/ OFN_PATHMUSTEXIST | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK) : 0);
        ofn.nFilterIndex    = 1;
        ofn.lpstrTitle      = Title;
        ofn.lpstrFilter     = szFilter;
        ofn.lpstrFile       = szResult; 
        ofn.nMaxFile        = MAX_PATH;
        ofn.lpstrDefExt     = szFilter + wcslen(szFilter) + 1; // UGH..
        if(DVDBURN == (eType & DVDBURN)) {
            ofn.lpfnHook        = DVDSelectorProc;
            ofn.lpTemplateName  = MAKEINTRESOURCE(IDD_DLG_EXPORTER_BURNNER);
            ofn.hInstance       = (HINSTANCE)&__ImageBase;
        }
        ofn.pExporter       = this;

        if(0 == (eType & OPENFILE)) {
            if( ::GetSaveFileName(&ofn))
                VerifyTargetFileName(szResult, szResultOut);
            else {
                SetLastError(CommDlgExtendedError());
                goto GracefulExit;
            }
        } else {
            ATLTRACE("GFX ThreadId = %u\r\n", GetCurrentThreadId());
            if( ::GetOpenFileName(&ofn))
                VerifyTargetFileName(szResult, szResultOut);
            else {
                SetLastError(CommDlgExtendedError());
                goto GracefulExit;
            }
        }

EXPORTFILENAME = の場合

    struct EXPORTFILENAME : OPENFILENAME {
        CVMNExporter*   pExporter;
        WCHAR           szResultBurningDrive[128];
    };

編集:

また、0/NULL を挿入して所有者 HWND を破棄しようとしました。それもうまくいきませんでした..

4

0 に答える 0