Delphi调用C++DLL,参数是char* 的方式


给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.
StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).
StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.
用 FreeMem 释放可以吗? 这样会少释放 4 个字节.

 

dll:

int GetCardInfo(int index, char* value)

Delphi的调用方式:

procedure TForm1.Button_readClick(Sender: TObject);
var
  ret:Integer;
  info:Pchar;
  card_lb:String;

begin

  Authenticate();
  Read_Content(1);
  info := StrAlloc(1000);   // 这一步 给字符指针分配内存很重要,后面不要忘了用 StrDispose(info)来释放内存。开始用info:=’123456‘赋值的方式都要报错

  ret := GetCardInfo(105, info);
  card_lb := '外国人居住证';
  case ret of
    1: card_lb := '居民身份证';
    2: card_lb := '居民身份证';
    3: card_lb := '港澳台居住证';
  end;
  StrDispose(info);


  //显示头像
  GetBmpPhotoExt();

end;

 

=================================================================

PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串
使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾
Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。
因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可).
把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar
变量. 当然也可以把Char数组第一个元素的地址给PChar.

pchar不是函数,而是数据类型。pchar是个指针类型,指向#0结尾的字符串,比如你看到如下代码:

var s:String;
begin
xxx(pchar(s));//把s强制转换为pchar(string本身也是指针)
//..
end;

以上摘自网络。

=========================================

(TryStrToInt 做个记忆标签)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM