VC++2013で Windows 2000で動くバイナリが作れない理由
例の VC++2010でWindows 2000を動くようにするライブラリを組み込んだ、
VC++2013 で コンパイルしたバイナリがこちら。
UxTheme.dll と GetModuleHandleExW が組み込まれてしまっているのですが、その原因を調べてみました。
src\crt0dat.c を開いてみたのがこちら
#if !defined (_CRT_APP) && !defined (_KERNELX)
typedef void (WINAPI * PFN_EXIT_PROCESS)(UINT uExitCode); void __cdecl __crtCorExitProcess ( if (GetModuleHandleExW(0, L"mscoree.dll", &hmod)) { /* |
原因のコードはこれ。
VC++標準アプリであっても、必ず終了時に .Net Framework の CorExitProcess を呼ぶためのコードが
GetModuleHandleExW で静的に呼ばれるようになっている。
これが標準ライブラリをリンクした時に必ず組み込まれるのが原因。
どう見ても、GetModuleHandleW でいいようなコードである。
素の Windows 2000でどうやっても動かないようにするため小細工にしか見えないw
Comments