C#的调用Delphi的DLL没有问题,DLL回调时遇到了麻烦,网上找了个方法,解决了这个问题

Delphi部分,列举了三种回调函数定义

  1. library test;
  2. uses
  3. SysUtils;
  4. {$R *.res}
  5. type
  6. TCallback = procedure (P: PChar); stdcall;
  7. TMethodCallback = procedure (P: PChar) of object; stdcall;
  8. procedure DllTest1(Callback: TCallback; P: PChar; I: Integer); stdcall;
  9. var
  10. S: string;
  11. begin
  12. S := Format('DllTest1 ''%s'' %d', [P, I]);
  13. if Assigned(Callback) then
  14. Callback(PChar(S));
  15. end;
  16. procedure DllTest2(_Callback: Pointer; P: PChar; I: Integer); stdcall;
  17. var
  18. Callback: TMethodCallback absolute _Callback;
  19. S: string;
  20. begin
  21. S := Format('DllTest2 ''%s'' %d', [P, I]);
  22. if Assigned(Callback) then
  23. Callback(PChar(S));
  24. end;
  25. procedure DllTest3(Callback: TMethodCallback; P: PChar; I: Integer); stdcall;
  26. var
  27. S: string;
  28. begin
  29. S := Format('DllTest3 ''%s'' %d', [P, I]);
  30. if Assigned(Callback) then
  31. Callback(PChar(S));
  32. end;
  33. exports
  34. DllTest1,
  35. DllTest2,
  36. DllTest3;
  37. begin
  38. end.

C#部分

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. namespace DllTest
  6. {
  7. class Program
  8. {
  9. public struct Method
  10. {
  11. public IntPtr code;
  12. public IntPtr data;
  13. }
  14. [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest1")]
  15. public static extern void DllTest1(IntPtr p, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
  16. [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest2")]
  17. public static extern void DllTest2(IntPtr p, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
  18. [DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "DllTest3")]
  19. public static extern void DllTest3(Method m, [MarshalAs(UnmanagedType.LPStr)] string s, int i);
  20. public delegate void Callback([MarshalAs(UnmanagedType.LPStr)] string s);
  21. public delegate void MethodCallback(IntPtr self, [MarshalAs(UnmanagedType.LPStr)] string s);
  22. public static void ShowInfo(string s)
  23. {
  24. Console.WriteLine("Info: " + s);
  25. }
  26. public static void ShowMethodInfo(IntPtr self, string s)
  27. {
  28. Console.WriteLine("Info: " + s);
  29. }
  30. static void Main(string[] args)
  31. {
  32. Method m;
  33. Callback info = ShowInfo;
  34. MethodCallback methodInfo = ShowMethodInfo;
  35. IntPtr p = Marshal.GetFunctionPointerForDelegate(info);
  36. IntPtr pm = Marshal.GetFunctionPointerForDelegate(methodInfo);
  37. // function callback example
  38. DllTest1(p, "test", 42);
  39. // method callback example 1
  40. DllTest2(pm, "test", 42);
  41. // method callback example 2
  42. m.code = pm;
  43. m.data = IntPtr.Zero;
  44. DllTest3(m, "test", 42);
  45. }
  46. }
  47. }

Delphi写的DLL回调C#的更多相关文章

  1. Delphi写的DLL,OCX中多线程一个同步问题

    Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面 ...

  2. 发现个delphi调用vc写的Dll中包括pchar參数报错奇怪现象

    发现个delphi调用vc写的Dll中包括pchar參数奇怪现象 procedure中的第一行语句不能直接调用DLL的函数,否则会执行报错,在之前随意加上条语句就不报错了奇怪! vc的DLL源代码地址 ...

  3. Delphi调用c++写的dll (me)

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  4. abap调vb写的dll实现电子天平的读数(带控件版)

    废话不多说,直接上. 鉴于abap调研的dll文件需要在wins注册,自己尝试过delphi和C#感觉不是很好,最后毅然选择了VB来写 因为需要用到MScomm控件,所以对于将要写的dll需要带for ...

  5. Delphi 使用之dll文件生成与调用

    DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...

  6. 深入Delphi下的DLL编程

    深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...

  7. Delphi7程序调用C#写的DLL解决办法(转)

    近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个 ...

  8. 【转载】java调用C++写的DLL

    用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...

  9. Delphi7程序调用C#写的DLL解决办法

     近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一 ...

随机推荐

  1. Unable to load native-hadoop library for your platform

    #HADOOP VARIABLES START export JAVA_HOME=/home/yang/jdk1.7.0_80export HADOOP_HOME=/home/hadoop/hadoo ...

  2. 数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法

    整理数据挖掘的基本概念和算法,包括关联规则挖掘.分类.聚类的常用算法,敬请期待.今天讲的是关联规则挖掘的最基本的知识. 关联规则挖掘在电商.零售.大气物理.生物医学已经有了广泛的应用,本篇文章将介绍一 ...

  3. C++/java之间的Socket通信大小端注意事项

    在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...

  4. 1、MVC和EF中的 Model First 和 Code First

    准备:先引入MVC和EF的dll包 *命令方法:打开工具——库程序包管理器——程序包管理器控制台,选择自己的项目 a)     Install-Package EntityFramework -Ver ...

  5. JMS总结

    一 什么是JMS 1.JMS,Java Message Service,Java消息服务是一种可以实现异步通讯的消息中间件MOM(Message Oriented Middleware,面向消息的中间 ...

  6. css技巧收集

    1. 使用 :not() 为导航添加/取消边框 传统的方法为导航栏添加边框: /* add border */ .nav li { border-right: 1px solid #666; } /* ...

  7. 利用 ipset 封禁大量 IP

    使用 iptables 封 IP,是一种比较简单的应对网络攻击的方式,也算是比较常见.有时候可能会封禁成千上万个 IP,如果添加成千上万条规则,在一台注重性能的服务器或者本身性能就很差的设备上,这就是 ...

  8. python 3 字符串转 json

    from json import *; JSONDecoder().decode('str')

  9. C++ 中queue(队列)的用法

    #include <iostream>#include <queue>#include <assert.h>/*调用的时候要有头文件: #include<st ...

  10. 观 GT Java语言管理系统的感悟

    继上次java系统考核完... 坦白说,我对我自己写的例子还是很满意的,虽说学长们给的评价不高 ,但我一直以为是学长们对我们的要求太高,以他们的眼光在看待我们,所以我对学长们给的评价并没有太过在意,当 ...