さっそくですが質問です。
ターゲット環境はWindows 2003 ServerとWindows XP Proで、
開発環境はWindows XP Pro SP2です。
VisualStdio .Net 2003、MFCのダイアログベースです。
上記環境で作成した開発したWindowsアプリケーションをDependencyWalkerで
「Start Profile」して、dllのロードされる位置を調べたところ、
「IMJPCD.DIC」「IMJP81.IME」「UXTHEME.DLL」等がプロセスが使用できる領域の
比較的中間位置にロードされていました。
そのため、プロセスで連続した巨大なメモリを確保しようとしたとき、「IMJPCD.DIC」の
ロードされている900MBほどしか確保できません。
本来は連続した巨大なメモリを使用しない設計が望ましいと思われますが、
それはどうしても変更できない事情があります。
どうにかして、「IMJPCD.DIC」「IMJP81.IME」せめてこの2つだけでも、ロード位置を後
ろに変更できないでしょうか。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200603/06030059.txt
> UI表示前にメモリ確保すればIME関連のDLLとか
> に邪魔されずに済むと思います。
だそうですが、保障は出来ません。
加えて、Vista からは ASLR(Address Space Load Randomization)という機能で、UI 表
示前にロードされる KERNEL32.DLL や USER32.DLL などもランダムなアドレスに配置され
ますので、Vista 以降では期待通りに行かない可能性があります。
> 本来は連続した巨大なメモリを使用しない設計が望ましいと思われますが、
> それはどうしても変更できない事情があります。
というわけで、根本的にはこっちを何とかするしかないです。
シャノンさんありがとうございます。
確かにロード前、つまり画面表示前にメモリ確保すると1.4GBくらい確保できました。
でも、画面表示後に確保するサイズが決まりますので申し訳ないですがだめでした。
連続した領域は、使ってるミドルウェアの引数に必要なので、
「IMJPCD.DIC」のロード位置を替えられないなら、
900MBくらいが限度という「仕様」で避けるしかなさそうです。
起動直後画面表示前にテキトーなサイズでメモリ確保してアドレス空間を予約しておき
画面表示直後にはメモリ処分して、サイズ確定後に再度確保
でよいのではないかと。
遅くなりました。
tetrapodさんの方法で、うまく連続領域を確保できました。
ありがとうございました。