C#调用Delphi编译的DLL函数库返回大文本数据
如果用PChar作为指针传递参数会丢失数据,之前做过测试,理想的方法是用StringBuilder对象分配一段内存区.
下面的代码是C#.NET枚举Novell网络中的对象(如用户/组/组织单元等).
API 函数定义:
LDAP_DLL_DelphiComplied.NovellGetObjects()
[DllImport(DLL_NAME, EntryPoint = "NovellGetObjects", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NovellGetObjects(string NovellPath, string ClassName, StringBuilder ADestBuffer, int ADestSize);
public static extern int NovellGetObjects(string NovellPath, string ClassName, StringBuilder ADestBuffer, int ADestSize);
C#.NET实现:
/// <summary>
/// 获取Novell网对象
/// </summary>
/// <param name="NovellPath">有效路径.如: .mis.csframework.com 或 .xx.cn</param>
/// <param name="ClassName">取对象类型: Organizational Unit,Group,User </param>
/// <returns></returns>
public static DataTable NovellGetObjects(string NovellPath, string ClassName)
{
try
{
StringBuilder sb = new StringBuilder(100000);
int count = LDAP_DLL_DelphiComplied.NovellGetObjects(NovellPath, ClassName, sb, 100000);
return GetStringTable(sb.ToString());
}
catch
{
return null;
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 获取Novell网对象
/// </summary>
/// <param name="NovellPath">有效路径.如: .mis.csframework.com 或 .xx.cn</param>
/// <param name="ClassName">取对象类型: Organizational Unit,Group,User </param>
/// <returns></returns>
public static DataTable NovellGetObjects(string NovellPath, string ClassName)
{
try
{
StringBuilder sb = new StringBuilder(100000);
int count = LDAP_DLL_DelphiComplied.NovellGetObjects(NovellPath, ClassName, sb, 100000);
return GetStringTable(sb.ToString());
}
catch
{
return null;
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
DELPHI 实现:
function NovellGetObjects(NovellPath: PChar; ClassName: PChar; ADestBuffer: PChar; ADestSize: Integer; only3: Integer): Integer; stdcall; export;
var S: string;
begin
S := DirTools.NovellGetObjects(NovellPath, ClassName, only3 = 1); //获取字符串
Move(S[1], ADestBuffer^, Min(ADestSize, Length(S) 1));
Result := Length(S);
end;
// 来源:www.CSFramework.com, C/S结构框架学习网
var S: string;
begin
S := DirTools.NovellGetObjects(NovellPath, ClassName, only3 = 1); //获取字符串
Move(S[1], ADestBuffer^, Min(ADestSize, Length(S) 1));
Result := Length(S);
end;
// 来源:www.CSFramework.com, C/S结构框架学习网

参考文档:
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
C#.Net 调用Delphi 编译的ActiveX COM组件(原)
C#调用C++编译的DLL详解
通过反射,调用DLL程序集某个类的静态方法打开窗体
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
C#直接使用DllImport外部Dll的方法-C/S开发框架
调用的目标发生了异常,找不到字段CSFrameworkV4_5.Library.frmBaseModule.pnlContainer
CSFramework.Main主程序引用关系与子系统调用
建议使用.NET Reactor进行DLL,EXE加密后再发布给用户使用
C# 调用API枚举窗体,根据标题还原窗体
RegSvr32注册DLL,OCX提示“找不到指定的模块”
[转帖]C#如何调用非托管函数(三)-实现回调函数
[转帖]C#如何调用非托管函数(一)
C# 动态编译及调用WebService的方法
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
DLL类库同时支持.NETFramework以及.NETCore(EF模型支持.NET双平台架构)|C/S开发框架
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
C#.Net 调用Delphi 编译的ActiveX COM组件(原)
C#调用C++编译的DLL详解
通过反射,调用DLL程序集某个类的静态方法打开窗体
Delphi封装Novell LDAP底层API, 提供给C#.Net开发
C#直接使用DllImport外部Dll的方法-C/S开发框架
调用的目标发生了异常,找不到字段CSFrameworkV4_5.Library.frmBaseModule.pnlContainer
CSFramework.Main主程序引用关系与子系统调用
建议使用.NET Reactor进行DLL,EXE加密后再发布给用户使用
C# 调用API枚举窗体,根据标题还原窗体
RegSvr32注册DLL,OCX提示“找不到指定的模块”
[转帖]C#如何调用非托管函数(三)-实现回调函数
[转帖]C#如何调用非托管函数(一)
C# 动态编译及调用WebService的方法
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
DLL类库同时支持.NETFramework以及.NETCore(EF模型支持.NET双平台架构)|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内容管理系统 |
在线客服
