・環境
Windows7 64bit VisualStudio2010SP1
ターゲットプラットフォーム:x86 32bit
COMを使用するアプリケーションを終了するときに以下の場所でアクセスバイオレーションが出て怒られます。
ソース:delayhlp.cppの380行目
__delayLoadHelper2内の
pfnRet = ::GetProcAddress(hmod, dli.dlp.szProcName);
と記述してあるところをコールスタックがまず表示します。
VisualStudio2008でビルドしていたときはおきなかった現象なのですが、COMのCoUninitialize周りでリソースの扱いが破綻しているような感じです。その根拠は上のラインで停止させたときにGetProcAddressに渡している変数の以下のような内容からです。
- dli {cb=36 pidd=0x59135a1c ppfn=0x591575e4 ...} DelayLoadInfo
cb 36 unsigned long
+ pidd 0x59135a1c __DELAY_IMPORT_DESCRIPTOR_ole32_dll {grAttrs=1 rvaDLLName=429088 rvaHmod=5561600 ...} const ImgDelayDescr *
+ ppfn 0x591575e4 __imp__CoUninitialize@0 int (void)* *
+ szDll 0x58c78c20 "ole32.dll" const char *
+ dlp {fImportByName=1 szProcName=0x5913627a "CoUninitialize" dwOrdinal=1494442618 } DelayLoadProc
+ hmodCur 0x75670000 {unused=9460301 } HINSTANCE__ *
pfnCur 0x00000000 int (void)*
dwLastError 0 unsigned long
- dli.dlp {fImportByName=1 szProcName=0x5913627a "CoUninitialize" dwOrdinal=1494442618 } DelayLoadProc
fImportByName 1 int
+ szProcName 0x5913627a "CoUninitialize" const char *
dwOrdinal 1494442618 unsigned long
- dli.dlp.szProcName 0x5913627a "CoUninitialize" const char *
67 'C' const char
ソース全体を見せることができないのが難ではありますが、この手の問題が発生する理由の心当たりだけでもご返答いただけると幸いです。
追記ですがDirectShow使ってます。
MicrosoftSDKのv7.1です。
ツイート | ![]() |