- ベストアンサー
最適化オプションと LoadLibrary(あるいはCoInitialize関連?)などを組み合わせると…
コンパイラはVisual C++ 2008 Express Editionです。 以下のようなコードを書くと #include <windows.h> #include <stdio.h> #include <tchar.h> #include <commctrl.h> #pragma comment ( lib, "comctl32.lib") HRESULT InitCOM_Ole32(){ //初期化 HMODULE hDLL( LoadLibrary(_T("Ole32.dll")) ); if (!hDLL) return E_FAIL; typedef HRESULT (*Func)( LPVOID ); Func func = (Func)GetProcAddress(hDLL,"CoInitialize"); HRESULT hr( func( 0 ) ); FreeLibrary( hDLL ); return hr; } void UnInitCOM_Ole32(){ //後始末 HMODULE hDLL( LoadLibrary(_T("Ole32.dll")) ); if (!hDLL) return; void (*func)() = (void (*)())GetProcAddress(hDLL,"CoUninitialize"); func(); FreeLibrary( hDLL ); } int main(){ InitCOM_Ole32(); InitCommonControls(); UnInitCOM_Ole32(); getchar(); return 0; } 最適化オプションが無効なら問題ないのですが、最適化オプションを付けると getchar(); 直後に落ちてしまいます。 また、別のプロジェクトでも、最適化オプションなしなら正常に動くのですが、最適化オプションを付けると、そちらは初期化関数サイドを抜ける瞬間には落ちてしまいます。 アセンブリ出力を見ても、関数名とかはそのまま書かれている分に感じるので、どこがまずいのかよく分かりません。 これらはどのように対処すればいいのでしょうか? あるいは、書き方自体が間違っている(未定義動作になる)部分があるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
お礼
なるほど! そういえば数回無意識に触れていたようですが、呼び出し規約という概念自体、あまりよく知らなかったです。 これを機に調べてみて納得しました。 また、jgkさんのおっしゃる通りWindowsAPI用に呼び出し規約を指定することで、どちらのプロジェクトも問題なく動作するようになりました。 ただ、質問文のコードのLoadLibrary、FreeLibraryの使い方が、この場合は問題ないのかあるのかはやはり気になるので、最大で数日程度締め切りを待たせてください。
補足
あ、あまりにgoodjobすぎて書き忘れてましたw ありがとうございます♪