求助改善Delphi调用olevariant出现“被呼叫方拒绝接收呼叫”

菜鸟请教各位我使用delphi操作AutoCAD时,在设置图层时定义layer:OleVariant;如果频繁的使用layer的话,就会出现“被呼叫方拒绝接收呼叫”的警告,请问各位有什么办法能避免这个情况的发生。(unAssigned释放OleVariant也无效。加sleep()延时等待效果也不明显我设置1500毫秒有时也会“被呼叫方拒绝接收呼叫”)而且这种情况发生非常随机性。请问各位如何才能解决这个问题?
uses
Comobj,activeX;
var
cad,caddoc,layer:OleVariant;
try
    cad:=GetActiveOleObject('AutoCAD.Application');
  except
    cad:=CreateOleObject('AutoCAD.Application');
end;
cad.visible:=true;//显示CAD
caddoc:=cad.ActiveDocument;
//使用layer不能连续太频繁
layer:=caddoc.layers.add('1');
layer.color:=1;
layer:=caddoc.layers.add('2');
layer.color:=2;
layer:=caddoc.layers.add('3');
layer.color:=3;
layer:=caddoc.layers.add('4');
layer.color:=4;
layer:=caddoc.layers.add('5');
layer.color:=5;
layer:=caddoc.layers.add('6');
layer.color:=6;
layer:=caddoc.layers.add('7');
layer.color:=7;
layer:=caddoc.layers.add('8');
layer.color:=8;
### 使用 Delphi 和 C# 进行 DLL 互操作 #### 调用 Delphi DLL 中的功能到 C# 为了使 C# 应用程序能够调用Delphi 创建的动态链接库 (DLL),需要遵循特定的法来定义函数签名并使用 `DllImport` 属性。 1. **创建 Delphi DLL** 在 Delphi 中,确保导出的函数被声明为 `stdcall` 呼叫约定,并带有 `export` 关键字。这使得这些函数可以从其他编程语言访问: ```delphi library MyDelphiDll; uses System.SysUtils, System.Classes; {$R *.res} function AddNumbers(a, b: Integer): Integer; stdcall; begin Result := a + b; end; exports AddNumbers name 'AddNumbers'; begin end. ``` 2. **在 C# 中导入和使用 Delphi 函数** 接下来,在 C# 程序里通过 P/Invoke 技术加载该外部函数。注意要匹配正确的数据类型以及呼叫约定 (`CallingConvention.StdCall`): ```csharp using System; using System.Runtime.InteropServices; public class Program { [DllImport("MyDelphiDll.dll", CallingConvention = CallingConvention.StdCall)] public static extern int AddNumbers(int a, int b); public static void Main(string[] args) { Console.WriteLine($"Result of adding numbers via Delphi DLL is {AddNumbers(5, 7)}"); } } ``` 以上展示了如何从 C# 调用 Delphi 编写的 DLL 的简单例子[^1]。 #### 将 C# 法暴露给 Delphi 如果目标是从 Delphi 调用 C# 实现的服务,则通常会采用 COM 或者 .NET Remoting 案;然而更现代的式可能是利用 gRPC 或 RESTful API 来实现跨平台通信。对于简单的场景也可以考虑编写一个托管的 C++/CLI wrapper 来桥接两者之间的差异。 当直接处理原生代码时,可以尝试下面这种法: 1. **构建 C# 类库作为 DLL 并设置 ComVisible 特性** 让类及其成员可见于 COM 客户端,比如 Delphi: ```csharp using System; using System.Runtime.InteropServices; namespace ManagedLibrary { [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IManagedClass { string HelloWorld(); } [ComVisible(true), ClassInterface(ClassInterfaceType.None)] public class ManagedClass : IManagedClass { public string HelloWorld() => "Hello from managed world!"; } } ``` 编译此项目并将生成的文件注册为 COM 组件以便能在 Delphi 工程中引用它。 2. **在 Delphi 中实例化并调用 C# 对象** 一旦完成了上述步骤,就可以像这样在 Delphi 中工作了: ```delphi var obj: OleVariant; begin CoInitialize(nil); try obj := CreateOleObject('ManagedLibrary.ManagedClass'); ShowMessage(obj.HelloWorld()); finally CoUninitialize; end; end; ``` 这种式允许 Delphi 应用程序与基于 .NET Framework 构建的应用组件交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值