C#中如何调用Delphi写的Dll

翻译|其它|编辑:郝浩|2007-12-07 11:39:32.000|阅读 990 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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


  结构图:


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:中国自学编程网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP