C#.Net 调用Delphi 编译的ActiveX COM组件(原)
C#.Net 调用Delphi 编译的ActiveX COM组件(原)
测试内容:
1. 向COM组件传递double类型的参数,并返回值
2. 向COM组件传递string类型的参数,并返回值
3. 向COM组件传递Object类型的参数,并返回值
4. .Net程序调用Delphi编译的COM组件,显示窗体和传递参数
5. 使用out关键字接收COM组件返回的数据
以上内容全部测试通过。
Delphi环境下测试ActiveX COM组件
Delphi导入类型库(Import Type Library),如下图:
Create Unit生成ActiveXLib_TLB.pas文件(类似.Net环境下自动生成的Interop.XXX.dll),如下图:
首先注册:regsvr32 "E:\CSFramework.Tech\Delphi_COM\bin\ActiveXLib.dll"
然后运行DelphiEXE.exe,如下图:
ActiveXLib.dll COM接口定义:
Pascal Code:
TCSFramework_Delphi_COM = class(TTypedComObject, ICSFramework_Delphi_COM)
public
function Calc(A, B: Double): Double; stdcall;
function SayHello(HelloStr: PChar): PChar; stdcall;
function TestObject(var AObject: OleVariant): PChar; stdcall;
function ShowFormWithParam(AParam: PChar;
out OutResult: OleVariant): HResult; stdcall;
end;
TCSFramework_Delphi_COM = class(TTypedComObject, ICSFramework_Delphi_COM)
public
function Calc(A, B: Double): Double; stdcall;
function SayHello(HelloStr: PChar): PChar; stdcall;
function TestObject(var AObject: OleVariant): PChar; stdcall;
function ShowFormWithParam(AParam: PChar;
out OutResult: OleVariant): HResult; stdcall;
end;
按钮事件:
Pascal Code:
procedure TForm1.Button1Click(Sender: TObject);
var I: ICSFramework_Delphi_COM;
begin
I := CoCSFramework_Delphi_COM.Create();
ShowMessage(I.SayHello('Hello,CSFramework.com!')); {传入字符串PChar类型}
I := nil;
end;
procedure TForm1.Button1Click(Sender: TObject);
var I: ICSFramework_Delphi_COM;
begin
I := CoCSFramework_Delphi_COM.Create();
ShowMessage(I.SayHello('Hello,CSFramework.com!')); {传入字符串PChar类型}
I := nil;
end;
procedure TForm1.Button2Click(Sender: TObject);
var I: ICSFramework_Delphi_COM;
begin
I := CoCSFramework_Delphi_COM.Create();
ShowMessage(VarToStr(I.Calc(100, 999))); {传入double类型的参数}
I := nil;
end;
procedure TForm1.Button3Click(Sender: TObject);
var I: ICSFramework_Delphi_COM;
var v: OleVariant;
begin
I := CoCSFramework_Delphi_COM.Create();
v := I;
ShowMessage(I.TestObject(v)); {向COM对象传入对象引用,参数类型:OleVariant}
I := nil;
end;
procedure TForm1.Button4Click(Sender: TObject);
var I: ICSFramework_Delphi_COM;
var V: OleVariant;
begin
I := CoCSFramework_Delphi_COM.Create();
I.ShowFormWithParam(PChar('Delphi内部调用COM对象并显示窗体和传递参数!'),V);
ShowMessage(VarToStr(V));
I := nil;
end;
C#.Net环境下调用Delphi编译的ActiveX COM组件
在.Net工程项目中添加引用,找到Delphi项目输出目录下的ActiveXLib.dll文件,debug目录自动Interop.ActiveXLib.dll文件,如下图:
运行程序,点Call COM Object按钮,效果图如下:
C# Code:
private void button1_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
try
{
//实例化COM对象
ICSFramework_Delphi_COM com = new CSFramework_Delphi_COMClass();
Object o = com as Object;//转换为对象Object
//传入double类型的参数
double d = com.Calc(100, 999);
sb.AppendLine(d.ToString());
//传入String类型的参数
string result = com.SayHello("Hello! CSFramework!");
sb.AppendLine(result);
//传入String类型的参数
string resulx = com.TestObject(ref o);
sb.AppendLine(resulx);
//.Net程序调用Delphi编译的COM对象,显示窗体并传递参数,返回Out参数!
object S;
com.ShowFormWithParam(".Net程序调用Delphi编译的COM对象,显示窗体和传递参数!", out S);
sb.AppendLine(S.ToString());
//释放COM对象的内存
Marshal.FinalReleaseComObject(com);
}
catch (Exception ex)
{
sb.AppendLine(ex.Message);
}
textBox1.Text = sb.ToString();
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
private void button1_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
try
{
//实例化COM对象
ICSFramework_Delphi_COM com = new CSFramework_Delphi_COMClass();
Object o = com as Object;//转换为对象Object
//传入double类型的参数
double d = com.Calc(100, 999);
sb.AppendLine(d.ToString());
//传入String类型的参数
string result = com.SayHello("Hello! CSFramework!");
sb.AppendLine(result);
//传入String类型的参数
string resulx = com.TestObject(ref o);
sb.AppendLine(resulx);
//.Net程序调用Delphi编译的COM对象,显示窗体并传递参数,返回Out参数!
object S;
com.ShowFormWithParam(".Net程序调用Delphi编译的COM对象,显示窗体和传递参数!", out S);
sb.AppendLine(S.ToString());
//释放COM对象的内存
Marshal.FinalReleaseComObject(com);
}
catch (Exception ex)
{
sb.AppendLine(ex.Message);
}
textBox1.Text = sb.ToString();
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
参考文章:
Delphi & C# Source 下载:

参考文档:
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
C#调用Delphi编译的DLL函数库返回大文本数据
标签:C#.Net组件开发 - 自定义设计器(ComponentDesigner)
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
C#调用C++编译的DLL详解
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
CSFramework.DB基于ADO.NET多数据库底层组件包(MSSQL+Oracle+MySQL)
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
标签:C#.Net组件开发 - 自定义设计器持久化对象的属性
C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象
C#.Net COM交操作性 - 强类型RCW和弱类型CCW详解
控件与组件的区别(Control&Component的区别)
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
VS2022/.NET7:CA1416:可在所有平台上访问此调用站点。"xxx"仅在 'windows'上受支持。
Winform C/S框架 - FastReport.NET组件下载-C/S开发框架
.NET 开源免费图表组件库 - ScottPlot(Winform,WPF 通用)-C/S开发框架
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
C#调用Delphi编译的DLL函数库返回大文本数据
标签:C#.Net组件开发 - 自定义设计器(ComponentDesigner)
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
C#调用C++编译的DLL详解
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
CSFramework.DB基于ADO.NET多数据库底层组件包(MSSQL+Oracle+MySQL)
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
标签:C#.Net组件开发 - 自定义设计器持久化对象的属性
C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象
C#.Net COM交操作性 - 强类型RCW和弱类型CCW详解
控件与组件的区别(Control&Component的区别)
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
VS2022/.NET7:CA1416:可在所有平台上访问此调用站点。"xxx"仅在 'windows'上受支持。
Winform C/S框架 - FastReport.NET组件下载-C/S开发框架
.NET 开源免费图表组件库 - ScottPlot(Winform,WPF 通用)-C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
