首页 > 其他分享 >Delphi dll 传递字符串

Delphi dll 传递字符串

时间:2023-10-05 10:12:17浏览次数:28  
标签:PChar begin end Buffer Delphi dll 字符串 Tmpstr

//dll code

uses
//  ShareMem,
  SysUtils,
  Windows,
  Math;

{$R *.res}


function TestString1(Buffer: PChar): PChar; stdcall;
var
 Tmpstr:string;
begin
 try
  Tmpstr := Buffer;
  if Tmpstr <> '' then
  begin
   Result := StrAlloc(Length(Tmpstr)+1);
   StrCopy(Result, Buffer);
  end
  else
   Result := nil;
 finally
  Tmpstr := '';
 end;
end;

function TestString2(Buffer, lpBuffer: PChar;Buflen:integer):Integer; stdcall;
var
 Tmpstr:string;
begin
 try
  Tmpstr := Buffer;
  if Tmpstr <> '' then
  begin
   Result := Min(Buflen, Buflen); //这里做测试,就弄一样的了
   Tmpstr := Copy(Tmpstr, 1, Result);
   StrCopy(lpBuffer,PChar(Tmpstr));
  end
  else
   Result := 0;
 finally
  Tmpstr := '';
 end;
end;


procedure FreeString(Buffer:PChar); stdcall;
begin
 StrDispose(Buffer);
end;


exports
  TestString1,
  TestString2,
  FreeString;

begin
end.

end.

//调用方
type
  TestString1Func = function (Buffer: PChar): PChar; stdcall;
  TestString2Func = function (Buffer, lpBuffer: PChar;Buflen:integer):Integer; stdcall;
  FreeStringProc  = procedure(Buffer:PChar); stdcall;


procedure TForm1.btn5Click(Sender: TObject);

var
  dll: THandle;
  TestString1: TestString1Func;
  FreeString: FreeStringProc;
  p, res: PChar;
begin
  dll :=  LoadLibrary('D:\云端工具\17wpdll\Y7WP_GoodsParser.dll');
  if dll <> 0 then
  begin
    @TestString1 := GetProcAddress(dll, 'TestString1');
    @FreeString := GetProcAddress(dll, 'FreeString');
    if Assigned(TestString1) then
    begin
      res  := TestString1(pchar(mmo1.Text)); // 调用DLL
       // 使用返回的字符串
      ShowMessage(res);

     // 释放内存
      FreeString(res);

      FreeLibrary(dll);
    end;
  end;
end;


procedure TForm1.btn6Click(Sender: TObject);
var
  dll: THandle;
  TestString2: TestString2Func;
  outp: PChar;
  outpsize:Integer;
begin
  dll :=  LoadLibrary('D:\云端工具\17wpdll\Y7WP_GoodsParser.dll');
  if dll <> 0 then
  begin
    @TestString2 := GetProcAddress(dll, 'TestString2');
    if Assigned(TestString2) then
    begin
      outpsize := length(mmo1.Text)+1;
      outp := StrAlloc(outpsize);
      outpsize  := TestString2(pchar(mmo1.Text), outp, outpsize); // 调用DLL
       // 使用返回的字符串
      ShowMessage('长度为:'+IntToStr(outpsize));
      ShowMessage(outp);
      StrDispose(outp);
      FreeLibrary(dll);
    end;
  end;
end;

以上提供两种方式:
1.dll分配内存,跟释放(需要调用方主动调用释放函数)。

2.调用方分配内存,自己释放。(需要知道长度是多少)。不知道的话,可以用两次,这里没有处理。需要判断lpbuffer是否nil

还有一种就是工程文件第一单元引用 ShareMem,调用方也是。
参数跟返回的类型直接用string ,不用管释放。程序发布时要带上 borlndmm.dll

缺陷:只能是 delphi 调用。(同版本,高版本没有试过。高版本的字符串默认不是ansichar了)


标签:PChar,begin,end,Buffer,Delphi,dll,字符串,Tmpstr
From: https://www.cnblogs.com/BTag/p/17743103.html

相关文章

  • JavaSE(07) - API -String字符串
    JavaSE(07)-API-String字符串p96API和API帮助文档p97String概述java.lang.String类代表字符串,java程序中的所有字符串文字(例如"abc")都是此类的对象.注意点:字符串的内容是不会发生改变的,他的对象在创建后不能被更改.p89String的构造方法代码实现和内存分析......
  • 十四天学会C++之第三天(数组和字符串)
    1.数组的定义和初始化数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。在C++中,数组的定义和声明非常简单。定义一个数组:数据类型数组名[数组大小];数据类型可以是整数、浮点数、字符等,数组......
  • 探索Redis的字符串设计思想
    探索Redis的字符串设计思想作者:沈自在1引言​ 在Redis中的字符串和我们平时Java中所写的字符串是不一样的,在Java的设计中String是由final修饰的,因此也就成就了他不可变的特性。此外,在C语言的字符标准形式中是以NULL结尾的,但是要通过strlen函数去获取长度的复杂度却是O(n)的,......
  • 库函数之字符函数与字符串函数(上)
    前言......
  • 前端歌谣的刷题之路-第三十五题-字符串字符统计
     目录前言题目 核心代码总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网......
  • 前端歌谣的刷题之路-第三十六题-字符串字符统计
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • MyBatis 注解写 SQL 判断空字符串 或 判断为空
    XXXXMapper接口:这里判断数据不能为空@Select("<script>" +"select*fromgs_store" +"<where>" +" <iftest='storeTel!=null'>" +" andstore_tel=#{storeTel}" +" <......
  • delphi泛型模板编程
    delphi泛型模板编程泛型模板编程的关键:泛型作用体现在模板,体现在虚实之间相互转换,以虚概实,以实就虚。unitTxInfo;interfaceusesSystem.Types,System.Classes,System.SysUtils,Generics.Collections;typeTPeople=recordName:string;Age:str......
  • 3-13 字符串类型 字符串类型:str 1.定义格式: 变量 = '内容'
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,......
  • 字符串小记 II:字符串自动机
    OI中的自动机指的是“有限状态自动机”,它是对一串信号进行处理的数学模型,一般由以下三部分构成:字符集(\(\Sigma\)),能够输入进自动机的字符集合。状态集合(\(Q\)),相当于有向图中的节点。转移函数(\(\delta\)),相当于有向图中的边。我们通过输入的信息在这个有向图中转移,而这个有......