小李子

小小的蜗牛,慢慢的爬。
随笔 - 133, 文章 - 0, 评论 - 6, 阅读 - 72063
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

2016年9月28日

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

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

 

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


C#部分

 

 

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

posted @ 2016-09-28 08:42 ljl_falcon 阅读(1369) 评论(0) 推荐(0) 编辑

2016年7月6日

摘要: Java学习笔记整理 本文档是我个人整理的,首先是想通过完成本文档更加扎实自己的基础加强对java语言的理解,然后就是想给入了门的同志们做下贡献。 当然,本文档主要是对java语言基础(当然还有很多基础没有涉及到)的进行较全面的理解已经整理,只要充分掌握了基础知识,学习高级部分的知识才会事半功倍犹如 阅读全文

posted @ 2016-07-06 13:18 ljl_falcon 阅读(719) 评论(0) 推荐(0) 编辑

2015年11月12日

摘要: 采用.net4.0作为基础技术平台,原来是采用.net4.5的,但是后来发现.net4.5不支持Windows Server2003,所以又降为.net4.0。 1、asp.net mvc 4.0 用于提供页面服务 2、asp.net web api 用于提供restful数据服务 3、... 阅读全文

posted @ 2015-11-12 14:52 ljl_falcon 阅读(233) 评论(0) 推荐(0) 编辑

2015年4月23日

摘要: 在Window98以下,如果程序要激活自己,只需要简单的调用SetForegroundWindow即可达到目的。但到Win98以后,再也没有这么简单了。新建一个简单的工程,加进一个Timer控件,设置时间间隔为3秒,接着在时间事件中写SetForegroundWindow(Handle),好,运行程... 阅读全文

posted @ 2015-04-23 13:57 ljl_falcon 阅读(502) 评论(0) 推荐(0) 编辑

2015年3月1日

摘要: 需要在相同目录下放一个.config文件,例如xxx.exe,就需要一个xxx.exe.config文件,内容如下:复制代码http://msdn.microsoft.com/zh-cn/library/w4atty68.aspx 阅读全文

posted @ 2015-03-01 11:52 ljl_falcon 阅读(219) 评论(0) 推荐(0) 编辑

2014年12月23日

摘要: 2014-09-26 09:53 李平 LEE的博客 字号:T|T大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段。AD:2014WOT全球软件技术峰会北京站 课程视频发布前言一个成熟的大型网站(如淘宝、京东等)的系统... 阅读全文

posted @ 2014-12-23 08:50 ljl_falcon 阅读(194) 评论(0) 推荐(0) 编辑

2014年12月11日

摘要: http://www.infoq.com/cn/articles/netty-server-create 阅读全文

posted @ 2014-12-11 14:34 ljl_falcon 阅读(165) 评论(0) 推荐(0) 编辑

2014年12月9日

摘要: 一天早上起来,偶然机会看到《环信支持千万并发即使通讯的技术要点》演示文档,简单翻阅之后,感觉干货很多,于是快速记下以下笔记。一。IM协议和IM ServerXMPP确实很传统,WhatsApp选用了,同时经过压缩、精简(比如说user字符串使用u字符替代)处理,让XMPP轻量不少。MQTT,如何实现... 阅读全文

posted @ 2014-12-09 11:43 ljl_falcon 阅读(297) 评论(0) 推荐(0) 编辑

2014年12月5日

摘要: 搞了我几个小时,终于成功在 Delphi 中静态链接了SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上下载测试工程下面说说方法1.当然是下载SQLite的源代码啦,呵呵,不过记得要是 all in one 的amalgamation版本哦(... 阅读全文

posted @ 2014-12-05 17:05 ljl_falcon 阅读(323) 评论(0) 推荐(0) 编辑

2014年10月10日

摘要: http://www.mobiletrain.org/about/news/android_video1.html?=qy《Android数独开发视频教程-第1季》(大牛讲解开发,根本停不下来。)http://www.mobiletrain.org/swift/?=qySwift开发视频教程《Swi... 阅读全文

posted @ 2014-10-10 15:55 ljl_falcon 阅读(148) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示