今天,对接第三方dll的时候出现如下问题:

接口声明如下:

long BL_tradeBalance (char *MerchantNumber,char *PosId,char *OperatorNumber,

int TypeCode,int PrintMode,

char *ResponseBuf,char *retCode,char *retMsg)

输入参数

char mMerchantNumber[6]        //商户号(门店号)

char mPosId[3]                 //pos机号(终端号)

char mOperatorNumber[20];       //操作员号

int TypeCode;                               //业态标识  1

int PrintMode;                  //打印模式  1

输出参数

char ResponseBuf[2048]        //f返回当日对账明细

char retCode [20]               //返回码

char retMsg [256]              //返回信息

----------------------------------------------------------------------------------------

delphi端调用

var

resBuf,retCode,retMsg: PChar;

调用:

dev.BL_tradeBalance(Pchar(sStoreNo),PChar(FPosNo),PChar(FEmpCode),1,1,resBuf,retCode,retMsg)

报dll异常

此时需要我们给返回的指针主动分配内存

resBuf := StrAlloc(2048);
   retCode := StrAlloc(20);
   retMsg := StrAlloc(256);

如果不是对接方主动说明,一般需要我们主动给返回值分配内存,然后做好释放工作

--------------------------------------------------------------------------------

resBuf := StrAlloc(2048);
   retCode := StrAlloc(20);
   retMsg := StrAlloc(256);
   try

....

finally

StrDispose(resBuf);
       StrDispose(retCode);
       StrDispose(retMsg);

end;

--------------------------------------------------------------------------------

扩展了解下字符指针内存分配函数

GetMem
AllocMem
ReallocMem
FreeMem GetMemory
ReallocMemory
FreeMemory New
Dispose NewStr
DisposeStr StrNew
StrAlloc
StrDispose 给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc. StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度). StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小. 用 FreeMem 释放可以吗? 这样会少释放 4 个字节. 这种类型的指针一般用于 API 函数的参数, 譬如获取窗口标题:

var
  p: PChar;
begin
  p := StrAlloc();
  GetWindowText(Handle, p, StrBufSize(p));
  ShowMessage(p); {Form1}
  StrDispose(p);
end;

delphi 给字符指针分配内存的更多相关文章

  1. Delphi 的内存操作函数(1): 给字符指针分配内存

    马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...

  2. Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)

    马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...

  3. Delphi 的内存操作函数(2): 给数组指针分配内存

    静态数组, 在声明时就分配好内存了, 譬如: var   arr1: ..] of Char;   arr2: ..] of Integer; begin   ShowMessageFmt('数组大小 ...

  4. Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)

    来自:http://blog.163.com/zhangzhifeng688%40126/blog/static/1652627582010102261748481/ 给结构体指针分配内存  但在很多 ...

  5. DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?

    DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?比如我定义个变量 var p:Pchar;如果这个变量声明为全局变量,需要分配内存吗?分配为局部变量,需要分为内存吗?为什么 ...

  6. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

  7. 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...

  8. Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)

    Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...

  9. delphi 精要-读书笔记(内存分配释放)

    delphi 精要-读书笔记(内存分配释放)     1.内存分为三个区域:全局变量区,栈区,堆区 全局变量区:专门存放全局变量 栈区:分配在栈上的变量可被栈管理器自动释放 堆区:堆上的变量内存必须人 ...

随机推荐

  1. ngnix 403 forbidden的解决办法

    1.在网站根目录下新建文件index.html.index.php. 2.主要是修改nginx的配置文件nginx.conf权限为755即可访问.

  2. linux的学习在runoob.com网站

    学习位置: Shell 变量

  3. [原创]Java项目统一UTC时间方案

    Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考 ...

  4. CSS DIV 居中

    左右居中 margin-left: auto; margin-right: auto; 上下居中

  5. 如何用CURL将文件下载到本地指定文件夹

    若直接调用下载文件的url有重定向,则需先调用第一个方法,获取到跳转后的url,才可直接下载.否则需要手动点击浏览器的下载确定按钮. 调用示例: $imgpath = "http://www ...

  6. 用Python+Django在Eclipse环境下开发web网站

    一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置.Django详细选项设 ...

  7. Java多线程-线程的调度(优先级)

    与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...

  8. Python模块及其导入

    一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...

  9. zookeeper java api(使用java代码操作zookeeper)

    1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...

  10. 用eclipse+svn插件,上传新项目到svn服务器

    给定trunk路径,https://svn.ws.125089.com/public/nlp/3434index/IndexByModelSolr/trunk/. 其中自己的web项目名字是Index ...