私の Delphi XE2 32 ビット アプリケーション (Update 4 Hotfix 1 バージョン 16.0.4504.48759) では、Format() ルーチンを使用してポインター値をログに記録しています。
例えば:
Format('MyObject (%p)', [Pointer(MyObject)]);
ただし、結果の文字列に不要な文字が含まれることがあります (たとえば、この場合、16 進数の代わりに '?' または '|' が使用されます)。
MyObject (4E?|2010)
次のように「%p」を「%x」に置き換えても、同じ結果が得られます。
Format('MyObject (%x)', [Integer(MyObject)]);
ただし、整数値を使用すると常に機能します。
Format('MyObject (%d)', [Integer(MyObject)]);
MyObject (1291453120)
私が気付いていないバグはありますか、それともここで経験した問題に関連している可能性がありますか?
バリアントで "%s" 以外を使用すると Format がクラッシュするのはなぜですか?
アップデート
Jeroen の回答は、消去法による解決策につながったので、受け入れました。F7 経由でアプリを起動する状況の後 (コメントによると)、プロセスのかなり早い段階で何か問題が発生しているに違いないと考えました。直感で、IDE メニューから madExcept を無効にし、アプリを再構築したところ、問題は解消されました。明らかに、madExcept が私のアプリケーションにリンクしているコードが何であれ、SysUtils 定数 TwoHexLookup を上書きしていました。madExcept の再有効化と再構築 (他に変更を加えることなく) も機能したため、リンク段階で何らかの破損があったに違いありません。
Jeroen が概説したメモリ破損を検出するための戦略は有用な演習であり、同様の状況に遭遇した場合に役立つはずです。