ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在C#中使用Delphi DLL

2019-05-19 12:07:24  阅读:159  来源: 互联网

标签:c delphi dllimport


我有一个用Delphi(未知版本)编写的第三方“神秘dll”,在delphi(2009年)中的工作示例,急需在我的C#代码中使用所述dll,并且几乎没有关于如何执行它的相关知识.

以下是使用此dll的Delpi示例:

type
TD_Query = function(host: WideString; port : Word;pud,query : WideString):WideString; stdcall;
procedure TForm11.Button6Click(Sender: TObject);
var
   Handle         : LongWord;
   D_Query        : TD_Query;
   sss            : WideString;
begin

 Handle := LoadLibrary('kobrasdk.dll');
 sss:='';
 if Handle <> 0 then
 begin
  @D_Query := GetProcAddress(Handle, 'D_Query');
  sss:=D_Query('host',8201,'pud','query');
  FreeLibrary(Handle);
 end;
end;

这是我尝试用C#解释它:

class Program
{
    [DllImport("C:\\Games\\kobrasdk.dll", CallingConvention = CallingConvention.StdCall,
        CharSet = CharSet.Ansi)]
    [return: MarshalAs(UnmanagedType.LPStr)]
    public static extern string D_Query(string host, ushort port, string pud, string query);


    static void Main(string[] args)
    {
        D_Query("test", 8201, "test", "test");
    }
}

不幸的是,我所拥有的是一个错误:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

从我白天阅读的内容来看,我可能会对返回类型或参数类型进行捏造.救命?

解决方法:

对于某些类型,Delphi ABI与Microsoft ABI不同. Delphi WideString是托管类型(在Delphi术语中),并且返回类型使用与Microsoft工具不兼容的ABI.

Delphi ABI将托管返回类型转换为隐藏的var参数.所以编译器转换:

function(host: WideString; port: Word; pud, query: WideString): WideString; stdcall;

procedure(var result: WideString; host: WideString; port: Word; pud, query: WideString); 
  stdcall;

因此,您可以通过导入转换后的伪装中的函数从C#访问原始的Delphi函数.

[DllImport(@"...", CallingConvention = CallingConvention.StdCall)]
public static extern void My_D_Query(
    [MarshalAs(UnmanagedType.BStr)]
    out string result,
    [MarshalAs(UnmanagedType.BStr)]
    string host,
    ushort port,
    [MarshalAs(UnmanagedType.BStr)]
    string pud,
    [MarshalAs(UnmanagedType.BStr)]
    string query
);

标签:c,delphi,dllimport
来源: https://codeday.me/bug/20190519/1134856.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有