C#中如何調用Delphi寫的Dll

來源:互聯網
上載者:User

在以前用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;

  結構圖:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.