Delphi写的DLL回调C#
C#的调用Delphi的DLL没有问题,DLL回调时遇到了麻烦,网上找了个方法,解决了这个问题
Delphi部分,列举了三种回调函数定义
- library test;
- uses
- SysUtils;
- {$R *.res}
- type
- TCallback = procedure (P: PChar); stdcall;
- TMethodCallback = procedure (P: PChar) of object; stdcall;
- procedure DllTest1(Callback: TCallback; P: PChar; I: Integer); stdcall;
- var
- S: string;
- begin
- S := Format('DllTest1 ''%s'' %d', [P, I]);
- if Assigned(Callback) then
- Callback(PChar(S));
- end;
- procedure DllTest2(_Callback: Pointer; P: PChar; I: Integer); stdcall;
- var
- Callback: TMethodCallback absolute _Callback;
- S: string;
- begin
- S := Format('DllTest2 ''%s'' %d', [P, I]);
- if Assigned(Callback) then
- Callback(PChar(S));
- end;
- procedure DllTest3(Callback: TMethodCallback; P: PChar; I: Integer); stdcall;
- var
- S: string;
- begin
- S := Format('DllTest3 ''%s'' %d', [P, I]);
- if Assigned(Callback) then
- Callback(PChar(S));
- end;
- exports
- DllTest1,
- DllTest2,
- DllTest3;
- begin
- end.
C#部分
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace DllTest
- {
- class Program
- {
- public struct Method
- {
- public IntPtr code;
- public IntPtr data;
- }
- [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest1")]
- public static extern void DllTest1(IntPtr p, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
- [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest2")]
- public static extern void DllTest2(IntPtr p, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
- [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest3")]
- public static extern void DllTest3(Method m, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
- public delegate void Callback([MarshalAs(UnmanagedType.LPStr)] string s);
- public delegate void MethodCallback(IntPtr self, [MarshalAs(UnmanagedType.LPStr)] string s);
- public static void ShowInfo(string s)
- {
- Console.WriteLine("Info: " + s);
- }
- public static void ShowMethodInfo(IntPtr self, string s)
- {
- Console.WriteLine("Info: " + s);
- }
- static void Main(string[] args)
- {
- Method m;
- Callback info = ShowInfo;
- MethodCallback methodInfo = ShowMethodInfo;
- IntPtr p = Marshal.GetFunctionPointerForDelegate(info);
- IntPtr pm = Marshal.GetFunctionPointerForDelegate(methodInfo);
- // function callback example
- DllTest1(p, "test", 42);
- // method callback example 1
- DllTest2(pm, "test", 42);
- // method callback example 2
- m.code = pm;
- m.data = IntPtr.Zero;
- DllTest3(m, "test", 42);
- }
- }
- }
Delphi写的DLL回调C#的更多相关文章
- Delphi写的DLL,OCX中多线程一个同步问题
Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面 ...
- 发现个delphi调用vc写的Dll中包括pchar參数报错奇怪现象
发现个delphi调用vc写的Dll中包括pchar參数奇怪现象 procedure中的第一行语句不能直接调用DLL的函数,否则会执行报错,在之前随意加上条语句就不报错了奇怪! vc的DLL源代码地址 ...
- Delphi调用c++写的dll (me)
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- abap调vb写的dll实现电子天平的读数(带控件版)
废话不多说,直接上. 鉴于abap调研的dll文件需要在wins注册,自己尝试过delphi和C#感觉不是很好,最后毅然选择了VB来写 因为需要用到MScomm控件,所以对于将要写的dll需要带for ...
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- 深入Delphi下的DLL编程
深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...
- Delphi7程序调用C#写的DLL解决办法(转)
近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一个 ...
- 【转载】java调用C++写的DLL
用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...
- Delphi7程序调用C#写的DLL解决办法
近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一 ...
随机推荐
- [解决方案] pythonchallenge level 5
l5=requests.get("http://www.pythonchallenge.com/pc/def/banner.p") body = l5.text lists = p ...
- 设置时间&时区
设置时间之前要先了解一件事,时间分为系统时间与硬件时间 如果硬件时间与系统时间不相同的话,经常会发现自己写的程序时间可能对不上 首先修改硬件时间 1)修改时区 输入命令: tzselect 按照指示选 ...
- 关于break和continue的区别
//break是结束整个循环体,continue是结束单次循环 比方说: while(x++ < 10){ if(x == 3) { break; } printf("%d\r\n&q ...
- sql server 中xml 数据类型的insert、update、delete
近日对SQL操作XML作了如下整理: 1.插入 XML DECLARE @myDoc XMLSET @myDoc = '<Root> <ProductDescription Prod ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, NSArray *paths = NSSearchPathForDirectoriesInDomains ...
- Android技术积累:开发规范
转载自Keegan小钢 http://keeganlee.me/post/android/20150709 书写规范 1. 编码方式统一用UTF-8. Android Studio默认已是UTF-8, ...
- oracle查询一个时间段每天的数据量
1.需求: 从所有数据中,查出一个时间段中每天的数据量,即:按日做汇总. 2.SQL语句模板: select trunc(date_col) date, sum(num_col) num, count ...
- android环境配置
1.计算机右键点击属性 2.点击高级系统设置 3.选择高级——>选择环境变量 4.点击系统变量下的新建 1)新建ANDROID_HOME:你的sdk所在的目录 2)新建JAVA_HOME:C:\ ...
- 推荐系统学习--cb+cf 初见
对于推荐系统的推出有两个条件:1.信息过载 ,2用户没有明确的需求 推荐系统算法中常见的有基于内容推荐,协同过滤推荐,协同过滤还可以分为基于人的协同过滤,基于内容协同过滤:社会推荐等 如何理解这些推荐 ...
- POJ 1101 简单BFS+题意
The Game 题意: Description One morning, you wake up and think: "I am such a good programmer. Why ...