在以前用Delphi開發的項目中,會經常用到TChart這個畫圖控件,它本身很強大,支持各類圖,如點線圖,柏拉圖,柱狀圖等等,加上可以輸出成BMP,JPEG,JPG,SVG,GIF等各種格式圖片,很好用,當時也封裝成比較獨立的DLL文件。這次開發.NET程序正好派上用場。
幾個關鍵技術點:
1 C#要以非托管方式調用DLL
2 C#把整理好的畫圖數據生成事先定義好格式的XML文件,傳給DLL
3 DLL解析XML文件,根據相應格式,要求,畫圖
4 DLL輸出GIF文件(經過比較GIF圖像失真率小,且文件大小最小)
5 C#裝載GIF文件,傳到前台展示
關鍵代碼:
C#
以下是引用片段:
#region 定義調用Delphi寫的畫圖DLL
///
/// 定義調用Delphi寫的畫圖DLL
///
private class DrawChartFromDll
{
//定義DLL文件名,此文件路徑要加到系統Path中
private const string _fileDll = @"Chart.dll";
//調用非托管Dll,GetChartFromXMLByNet是ChartAccess.dll公開的函數名稱
[DllImport(_fileDll, EntryPoint = "GetChartFromXMLByNet", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
//C#中的申明
public static extern int GetChartFromXMLByNet(int piChartType, string psXMLFileName, string psPriChartFileName, string psSecChartFileName, string psPriHotFileName, string psSecHotFileName);
}
#endregion
public ChartResultData GetCharts(ChartData _ChartData, Hashtable _HotPriAdditionSeqNo, Hashtable _HotSecAdditionSeqNo)
{
//根據數據生成XML文件
string _xmlFileName = "";
ChartResultData _ChartResultData = new ChartResultData();
try
{
_xmlFileName = this.ConvertDataToXml(_ChartData);
}
catch (Exception err)
{
_ChartResultData.ErrMessage = err.Message;
}
...
//調用DELPHI,取得返回參數
int _return = -1;
try
{
_return = DrawChartFromDll.GetChartFromXMLByNet(m_chartType, _xmlFileName, _priChartFileName, _secChartFileName, _priHotFileName, _secHotFileName);
}
catch (Exception err)
{
if (_return > 0)
{
//刪除臨時生成的XML文件
this.DeleteTempFile(_xmlFileName);
this.DeleteTempFile(_priChartFileName);
this.DeleteTempFile(_secChartFileName);
this.DeleteTempFile(_priHotFileName);
this.DeleteTempFile(_secHotFileName);
_ChartResultData.ErrMessage = err.Message;
return _ChartResultData;
}
else
{
//可能因為安全性問題,在頻繁連續調用DLL方法時有可能出現內存保護錯誤信息,雖然出錯,但方法已經正確調用並能返回正確的值,此時可以忽略此錯誤
_return = 0;
}
}
//刪除臨時生成的XML文件
this.DeleteTempFile(_xmlFileName);
...
}
Delphi
沒有什麼特別的注意事項,和其它的DLL基本一樣,注意string換成PChar就可以了。
以下是引用片段:
function GetChartFromXMLByNet(piChartType: integer; psXMLFileName: PChar; psPriChartFileName: PChar; psSecChartFileName: PChar; out psPriHotMsg: PChar; out psSecHotMsg: PChar): integer; stdcall;export;
結構圖:
天極開發頻道 最專業的程序開發網站