delphi 给字符指针分配内存
今天,对接第三方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 给字符指针分配内存的更多相关文章
- Delphi 的内存操作函数(1): 给字符指针分配内存
马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...
- Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)
马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...
- Delphi 的内存操作函数(2): 给数组指针分配内存
静态数组, 在声明时就分配好内存了, 譬如: var arr1: ..] of Char; arr2: ..] of Integer; begin ShowMessageFmt('数组大小 ...
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
来自:http://blog.163.com/zhangzhifeng688%40126/blog/static/1652627582010102261748481/ 给结构体指针分配内存 但在很多 ...
- DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?
DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?比如我定义个变量 var p:Pchar;如果这个变量声明为全局变量,需要分配内存吗?分配为局部变量,需要分为内存吗?为什么 ...
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...
- delphi 精要-读书笔记(内存分配释放)
delphi 精要-读书笔记(内存分配释放) 1.内存分为三个区域:全局变量区,栈区,堆区 全局变量区:专门存放全局变量 栈区:分配在栈上的变量可被栈管理器自动释放 堆区:堆上的变量内存必须人 ...
随机推荐
- Oracle11gR2_ADG管理之恢复主库的truncate表实战
备库开启flashback database #关闭备库的同步 SQL> alter database recover managed standby database cancel; Data ...
- 把Oracle的数据导入到SQL2012中 导出数据--SSIS
在ORACLE表和SQL Server表之间'转换'那步很重要,可以改变默认的字段数据类型,如image->text,decimal->int number ->int (注意设置 ...
- 2-2 groovy基础知识-理论介绍
- dojo模块化开发
转自https://www.cnblogs.com/sharpest/p/6242801.html
- Codeforces 1109C 线段树
题意及思路:https://www.cnblogs.com/TinyWong/p/10400682.html 代码: #include <bits/stdc++.h> #define ls ...
- SpringBoot18 Swagger、API接口文档生成、WireMock、模拟后台数据
1 Swagger 1.1 简述 前后端分离的项目需要前后端开发人员协同工作,后台开发人员需要给到前端开发者一套API文档:利用Swagger可以简单高效的帮助后台开发者生成RestfulAPI开发文 ...
- /error处理
1 BasicErrorController 1.1 简述 SpringMVC框架在出现错误时有一个默认的错误请求 /error:出现异常之后执行/error请求之前框架会判断出现异常的请求类型,然后 ...
- 824. Goat Latin山羊拉丁文
[抄题]: A sentence S is given, composed of words separated by spaces. Each word consists of lowercase ...
- Opennebula自定义VM 实现方法-Contextualizing Virtual Machines 2.2
from:http://archives.opennebula.org/documentation:archives:rel2.2:cong There are two contextualizati ...
- Django--form验证及错误处理
需求 from表单验证和ajax验证时返回的错误信息处理 速查 1.form表单提交时错误信息显示 views 1 2 error = form表单实例化对象.errors return render ...