サイトカレンダー

サイトカレンダーをスキップ

2018年 01月
«
»
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

記事カテゴリ

ユーザー機能


 2018年1月19日(金) 02:43 JST

[Delphi] 複数バージョンのmidasの問題点と対処方法

  • 2012年12月 8日(土) 08:53 JST
  • 投稿者:
  • 表示回数
    1,488

困ったことが起きた。

何が困ったことかというと、とある会社のソフトが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;

トラックバック

このエントリのトラックバックURL:
http://www.blackcatlab.com/trackback.php/ProgramingFAQ_del0087

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。