Delphi 2007では正常に機能するが、D2010では機能しないコードがいくつかあります。これには、文字列を渡し、それをPWideChar(具体的には、UnicodeStringポインターではなく、WideStringポインター)に変換し、何らかの処理を行ってから、その文字列に対してSysFreeStringを呼び出すことが含まれます。空白の文字列が渡されるまでは正常に機能し、その後SysFreeStringが壊れます。それは、Int 3
NTDLL.DLL内にブレークポイントを発生させることになる一連のことを呼び出します。この時点を過ぎて続行すると、
プロジェクトで例外クラス$C0000005が発生し、メッセージ「0x7747206eでのアクセス違反:アドレス0x539b8dbaの読み取り」が発生しました。
よく見ると、これは標準のアクセス違反メッセージではありません。
スタックトレースがヒットしたときのトップは、Int 3
次のようになります。
:774e475d ; ntdll.dll
:774afad0 ; ntdll.dll
:774e5de9 ; ntdll.dll
:774a6dff ; ntdll.dll
:76fc1075 ; C:\Windows\system32\ole32.dll
:770e443a ; C:\Windows\system32\oleaut32.dll
:770e3ea3 oleaut32.SysFreeString + 0x4a
ここで何が起こっているのか誰かが知っていますか?
編集(コメントから):
ただし、これはWideStringではありません。これはStringToOleStrによって生成されたPWideCharであり、空白以外の文字列が渡されてもダブルフリーエラーは発生しません。残念ながら、これは著作権で保護されているサードパーティコンポーネントであるため、コードサンプルを投稿することはできません。(サポートが終了したため、サポートを依頼することはできません。基本的に、全体が1つの大きな混乱です。)