これはちょっと長い説明ですが、デバッグ プロセスのどこに問題があるのか正確にはわかりません。
C++ DLL の関数を呼び出す Excel マクロがあります。この関数を呼び出すたびに、Excel インスタンスは突然強制終了し、警告やエラー メッセージは表示されません。次のようにVisual Studio Expressでデバッグを設定して、何が起こっているのかを追跡しようとしています:
構成プロパティ->デバッグ->コマンド: C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE
構成プロパティ->C/C++->ブラウズ情報->ブラウズ情報を有効にする:はい (/FR)
次に、テストする関数をクリックしてデバッグを開始し、ブレークポイントを設定して F5 キーを押します。Excel.exe のデバッグ情報が利用できないというエラー メッセージが表示され、[はい] をクリックしてデバッグを続行します。
Excel インスタンスが開きます。C++ ブレークポイントは、白い「ブレークポイントはヒットしません」という円に変わりました。マクロを含むワークブックを開き、マクロを実行します。
Visual Studio で、EXCEL.EXE がブレークポイントをトリガーしたというメッセージが表示されます。これは、C++ コードで設定したブレークポイントであると思われます。[ブレーク] をクリックします。新しいタブが開き、次のメッセージが表示されます。
wntdll.pdb not loaded
この時点で、デバッガーは続行されないため、手動で停止し、Excel を強制終了します。出力ウィンドウは言う
EXCEL.EXE はコード 0 で終了しました
[デバッグ オプション] -> [シンボル] に移動し、[Microsoft シンボル サーバー] ボックスをオンにします。シンボルが必要な DLL がわからないので、[すべてのモジュールのシンボルを自動的に読み込む] を選択します。デバッガを起動します。
Excel で利用できないデバッグ情報に関する同じメッセージが表示され、Excel インスタンスが開きます。ブックを再度開き、マクロを開始します。その間、VS では多くの DLL のシンボルが読み込まれます。
VS に次のようなタブが表示されます。
Source not available
Source information is missing from the debug information in this module.
適切な DLL のシンボルがまだロードされていない可能性がありますが、すべてのシンボルがロードされるのを待ちたくありません。以前に試してみたところ、10分経ってもシンボルがまだロードされていました。
コール スタックを見ると、次のコールが最新です。
ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4() Unknown
ntdll.dll!_RtlpLogHeapFailure@24() Unknown
私の C++ アプリのコードはまだ呼び出されていません。これらの呼び出しは、VBE7 および ole32 呼び出しの直後に行われます。
コードをデバッグして、Excel が終了する理由を突き止めたいだけです。ここで何が起こっているのか理解できる人はいますか?
編集: エラーが発生したときの完全なコール スタックは次のとおりです。
ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4() Unknown
ntdll.dll!_RtlpLogHeapFailure@24() Unknown
ntdll.dll!_RtlSizeHeap@12() Unknown
ole32.dll!CRetailMalloc_GetSize(IMalloc * pThis, void * pv) Line 710 C++
oleaut32.dll!APP_DATA::FreeCachedMem(void *,unsigned long) Unknown
oleaut32.dll!_SysFreeString@4() Unknown
VBE7.DLL!_lblEX_FFreeStr() Unknown
VBE7.DLL!_lblEX_VCallHresult() Unknown
VBE7.DLL!_lblEX_ImpAdCall() Unknown
VBE7.DLL!InvokeImmedSub(struct RTMI *,class GEN_PROJECT *,class EXFRAME *,struct IDispatch *) Unknown
VBE7.DLL!WATCHMGR::ExecuteImmedLogln(char * *,unsigned int,int,class GEN_PROJECT *,unsigned long,int,int,class WATCH *) Unknown
VBE7.DLL!ExecProcUnderCursor(void) Unknown
VBE7.DLL!_EbInvokeItem@4() Unknown
VBE7.DLL!CmdFDispatchCommand(unsigned short) Unknown
VBE7.DLL!FTranslateAccelerator(struct tagMSG *,int) Unknown
VBE7.DLL!FRubyMsg(struct tagMSG *) Unknown
VBE7.DLL!MainFTranslateMessage(struct tagMSG *,unsigned long) Unknown
VBE7.DLL!CMsoComponent::FPreTranslateMessage(struct tagMSG *) Unknown
EXCEL.EXE!2f9f874a() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for EXCEL.EXE]
EXCEL.EXE!2f9f73f4() Unknown
MSO.DLL!637b77f1() Unknown
MSO.DLL!637e0143() Unknown
EXCEL.EXE!2f990ec5() Unknown
msvcr90.dll!___set_flsgetvalue() Unknown
msvcr90.dll!__getptd_noexit() Unknown
msvcr90.dll!__getptd() Unknown
msvcr90.dll!_LocaleUpdate::_LocaleUpdate(struct localeinfo_struct *) Unknown
msvcr90.dll!__ismbcalpha() Unknown
msvcr90.dll!__ismbblead() Unknown
0062430d() Unknown
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!___RtlUserThreadStart@8() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown