VC++2013で Windows 2000で動くバイナリが作れない理由

例の VC++2010でWindows 2000を動くようにするライブラリを組み込んだ、
VC++2013 で コンパイルしたバイナリがこちら。

vc2013

UxTheme.dll と GetModuleHandleExW が組み込まれてしまっているのですが、その原因を調べてみました。

src\crt0dat.c を開いてみたのがこちら

#if !defined (_CRT_APP) && !defined (_KERNELX)

typedef void (WINAPI * PFN_EXIT_PROCESS)(UINT uExitCode);

void __cdecl __crtCorExitProcess (
        int status
        )
{
        HMODULE hmod;
        PFN_EXIT_PROCESS pfn;

        if (GetModuleHandleExW(0, L"mscoree.dll", &hmod)) {
            pfn = (PFN_EXIT_PROCESS)GetProcAddress(hmod, "CorExitProcess");
            if (pfn != NULL) {
                pfn(status);
            }
        }

        /*
         * Either mscoree.dll isn't loaded,
         * or CorExitProcess isn't exported from mscoree.dll,
         * or CorExitProcess returned (should never happen).
         * Just call return.
         */
}
#endif  /* !defined (_CRT_APP) && !defined (_KERNELX) */

原因のコードはこれ。
VC++標準アプリであっても、必ず終了時に .Net Framework の CorExitProcess を呼ぶためのコードが
GetModuleHandleExW で静的に呼ばれるようになっている。
これが標準ライブラリをリンクした時に必ず組み込まれるのが原因。

どう見ても、GetModuleHandleW でいいようなコードである。
素の Windows 2000でどうやっても動かないようにするため小細工にしか見えないw

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です