困ったことが起きた。
何が困ったことかというと、とある会社のソフトがDelphiで作られていたのだが、midasを利用してデータベースアクセスするように作られていた。これ自体は何の問題も無いごく普通のことなのであるが、このソフトのmidasが非常に古いものであった。
midasはシステムに1つしかもてないので、通常はシステムフォルダのmidas.dllを置き換えるものであるが、そのソフトはソフトウェアのインストールフォルダにmidas.dllをコピーし、レジストリにその場所を登録していた。
※midas.dllはSide-by-Side(複数バージョンのソフトウェアコンポーネントの衝突を避けるための仕組みである)ができない。
このようなことをされると、他のDelphiアプリケーションもそのmidas.dllを参照することになる。Delphi 2010や、Delphi XE付属のmidas.dllは多くのバグが修正されていたり、また新機能に対応するように変更が加えられているはずにもかかわらずである。
こんな、midas.dllではあるが回避方法がいくつかあることがわかった。
実際に下記のコードを実行すると、表とかソの文字が化けた。
var sXML: string; begin ... TXMLTransformClient.TransformationFile := "hogehoge.xtr" sXML := TXMLTransformClient.GetDataAsXML; end;
表なんかよく文字化けするという典型的な文字なので、即2バイトコード目が¥(0x5C)って言うやつだと思った。
調べてみると、midas.dllでは発生せず、MidasLibの時のみ発生する
これでは使い物にならないので、メーカーにmidas.dllとMidasLibの互換性の確認、不具合の原因調査、そして対応を依頼した。
追記
Embarcaderoからの回答を踏まえ原因を簡単にまとめる。
原因となる箇所は、Xmlxform.pas の 683行目にある。
IAppServer が問題をもっているため、TXMLTransformClient の返す結果がおかしくなるとのこと。現在TXMLTransformClient のみがこの IAppServer インターフェイスを使用している。
※この問題は現最新バージョンのXE3でも確認されたとのこと。
VarPacket := FDataCache.AppServer.AS_GetRecords(GetProviderName, -1, RecsOut, Byte(Options), '', Params, OwnerData);
Embarcaderoから提示された回避コード
バグ発生確認コード
XMLTransformClient1.ProviderName := 'DataSetProvider1'; XMLTransformClient1.TransformGetData.TransformationFile := 'ToXml.xtr'; XML := XMLTransformClient1.GetDataAsXml(''); Memo1.Text := XML;
バグ回避例1(XMLストリングをファイルとして取得)
ClientDataSet1.SaveToFile('aaa.xml',dfXMLUTF8); XMLTransform1.SourceXmlFile := 'aaa.xml'; XMLTransform1.TransformationFile := 'ToXml.xtr'; Memo1.Text := XMLTransform1.Data;
バグ回避例2(XMLストリングを文字列として取得)
var stXML: TStringStream; begin stXML := TStringStream.Create('', TEncoding.UTF8, False); try stXML.Position := 0; ClientDataSet1.SaveToStream(stXML,dfXMLUTF8); stXML.Position := 0; XMLTransform1.SourceXml := stXML.ReadString(stXML.Size); XMLTransform1.TransformationFile := 'ToXml.xtr'; Memo1.Text := XMLTransform1.Data; finally stXML.Free; end; end;
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。