C# 调用Delphi dll 实例代码

delphi dll 源码:

代码如下:

library dllres;

type
     char10 = array[0..9] of char;
     TMydata = packed record
       id: Integer;
       name: char10;
       married: Boolean;
       salary: Double;
     end;
    PMydata = ^TMydata;

const
    RESSTR: array[0..4] of string = ('HELLO', 'COLOR', 'DELPHI', 'shared', 'library');
    NO_RESULT=   'no result';
  var
   mydata: TMydata;

{$R *.res}
  // 返回字符串指针
  function  getResStr(aindex: Integer): PChar;  stdcall;
  begin
    if aindex < Length(RESSTR) then
    begin
      Result := pchar(RESSTR[aindex]);
    end
    else
    begin
      Result := pchar(NO_RESULT);
    end;
  end;

// 返回结构体指针
  function getMydata: PMydata; stdcall;
  begin
    with mydata do
    begin
      id := 123;
      name := 'obama';
      married := false;
      salary := 1200;
    end;
    Result := @mydata;
  end;

exports   getResStr, getMydata;

begin
end.

C# 调用示例:

代码如下:

class Invoke_Delphi_Dll_Exam
    {
        [DllImport("dllres.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr getResStr(int index);

[DllImport("dllres.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr getMydata();

public struct Mydata
        {
            public int id; //0
            public string name; //4
            public bool married; //24
            public double salary; //25

public Mydata(byte[] data)
            {
                if (data != null && data.Length == 33) {
                    id = BitConverter.ToInt32(data, 0);
                    name = Encoding.Unicode.GetString(data, 4, 20).Replace("\0",""); // 去掉尾部的0字符
                    married = BitConverter.ToBoolean(data, 24);
                    salary = BitConverter.ToDouble(data, 25);
                }
                else {
                    id = 0;
                    name = String.Empty;
                    married = false;
                    salary = 0;
                }
            }

public override string ToString()
            {
                return String.Format("id: {0}, name: {1}, married: {2}, salary: {3}",
                    id, name, married, salary);
            }
        }

private static void Main(string[] args)
        {
            Console.WriteLine(Marshal.PtrToStringAuto(getResStr(0)));

byte[] data = new byte[33];
            Marshal.Copy(getMydata(), data, 0, 33);
            Mydata mydata = new Mydata(data);
            Console.WriteLine(mydata);
        }
    }

(0)

相关推荐

  • Delphi 用DLL实现插件的简单实例

    Delphi 用DLL实现插件的简单实例 这是DLL的代码 实现代码: library MyDll; uses SysUtils, Dialogs, Classes; procedure ShowInfo(info:PChar);stdcall; begin ShowMessage('您选择了['+info+']'); end; function GetCaption:Pchar; begin Result := '中国'; end; exports ShowInfo, GetCaption;

  • delphi中一个值得大家来考虑的DLL问题

    以下是我的原代码:==========================================================================================DPR  单元代码program Mdiform;uses  Forms,  UMdiform in ´UMdiform.pas´ {Mainform},  UDM in ´UDM.pas´ {GlobalDM: TDataModule},  UFun in ´UFun.pas´;{$R *.res}

  • C# 调用Delphi dll 实例代码

    delphi dll 源码: 复制代码 代码如下: library dllres; type     char10 = array[0..9] of char;     TMydata = packed record       id: Integer;       name: char10;       married: Boolean;       salary: Double;     end;    PMydata = ^TMydata; const    RESSTR: array[0

  • mybatis调用存储过程的实例代码

    一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_increment, name varchar(10), sex char(2) ); insert into p_user(name,sex) values('A',"男"); insert into p_user(name,sex) values('B',"女"); ins

  • vue调用高德地图实例代码

    一. vue-amap,一个基于 Vue 2.x 和高德地图的地图组件 https://elemefe.github.io/vue-amap/#/ 这个就不细说了,按照其文档,就能够安装下来. 二. 按照官方提供的方法引入 1.修改webpac.base.conf.js文件 externals: { 'AMap': 'AMap' } 2.引入sdk 引入有两种方式,一种是页面直接引入 复制代码 代码如下: <script type="text/javascript" src=&q

  • C#调用新浪微博API实例代码

    C#调用新浪微博API WebRequest wq = WebRequest.Create(this.address); HttpWebRequest hq = wq as HttpWebRequest; string username = "keguangqiang@163.com"; string password = "3216731ks"; string appkey = "5786724301"; System.Net.Credenti

  • C#反射调用拓展类方法实例代码

    目录 C# 类拓展方法 C#反射调用拓展类 总结 今天封装Protobuf封包时候遇到一个问题: Protobuf的反序列化方法MergeFrom,是写在扩展类里的:c#拓展类 C# 类拓展方法 要求: 扩展方法类必须为静态类: 拓展方法必须为静态方法,参数为this+需拓展类对象: 多个类拓展方法可以写在一个拓展类中: public class TestExtension { public string Test1() { return "test"; } } public stat

  • java远程连接调用Rabbitmq的实例代码

    本文介绍了java远程连接调用Rabbitmq,分享给大家,希望此文章对各位有所帮助. 打开IDEA创建一个maven工程(Java就可以了). pom.xml文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apac

  • C#调用QQ_Mail发送邮件实例代码两例

    代码案例一: private void button1_Click(object sender, EventArgs e) { string myMaillAdress = ""; string myMaillPassword = ""; string myMaillMessage = ""; string toMaillAdress = ""; QQEmail qq_mial = new QQEmail(); bool se

  • ReactNative-JS 调用原生方法实例代码

    第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture; import android.content.Context; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule

  • java实现远程桌面的实例代码

    java实现远程桌面的实例代码 控制端将鼠标事件传递到服务端 服务端拿到鼠标事件之后传输到客户端 客户端拿到鼠标事件之后,通过robot类即可完成,并且截屏将图片发给服务器,服务器再发给控制端 被我简化之后得到 //先介绍一下robot类的简单使用 import java.awt.AWTException; import java.awt.Robot; import java.awt.event.InputEvent; /** * 使用robot * @author 哑元 * */ public

  • python调用Delphi写的Dll代码示例

    首先看下Delphi单元文件基本结构: unit Unit1; //单元文件名 interface //这是接口关键字,用它来标识文件所调用的单元文件 uses //程序用到的公共单元 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type //这里定义了程序所用的组件,一些类,以及组件所对应的过程.事件 TForm1 = class(TForm) private //定义私

随机推荐