今天读一个INI遇到个Buf,现将解决办法发上来共享一下
smrken2013/08/01软件综合 IP:广东
声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
环境:delphi 7
问题动作:procedure XXXXXXXXXXXadSectionValues(const Section: string; Strings: TStrings);
问题描述: 读取某节点下的全部键和值,当内容较多时出现读不完的情况
网上类似的问题:XXXXXXXXXXXXXXXXXXX/335204019/item/02eb2f45c3628714896d1086
一开始我没有看其源码,直接搜索了,只找到类似的疑问! 然后我就翻阅其源码,发现该源码单元比较简短,正好...

问题原因追查源码:
ReadSectionValues主要调用了ReadSection,而ReadSection的设计有缺陷下面贴出其原源代码

//******************
const //声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
  BufSize = 16384;
主要原因是内存不够,而又没有根据情况重新分配一个适合的内存大小,
其原源码只是简单检查起是否读取失败!
API参考连接:XXXXXXXXXXXXXXXXXXXXXX/view/XXXXXXXXXXm
解决办法,将这个XXXXXXXXXXXs文件直接添加到工程,然后直接修改成如下样子,就可以不改动其余东西,解决这个问题!
//******************
检查返回值,若指示内存不够容纳,则使用ReallocMem来重新分配

//声明:本文由科创论坛smrken会员发表,转载请注明出处,谢谢!
谢谢收听, 全文完.
来自:计算机科学 / 软件综合
3
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
phpskycn
10年10个月前 IP:未同步
554514
回 楼主(smrken) 的帖子
LZ能解释一下为何会内存不够么……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smrken作者
10年10个月前 IP:未同步
554554
回 1楼(phpskycn) 的帖子
假设INI文件内容有如下:
[Node]
Key=Value
-------------------------
"Key=Value" 需要9个字节长度的内存,再加上一个0结尾,正常是要10个字节!
如果GetPrivateProfileString(...)中的nSize的值比需求小,就会出现特定的返回值!
而原源代码的设计使用了固定的内存大小进行一次性分配,并且仅检查是否失败,并没有针对内存与实际内容不匹配时
的解决方法,
文中的修改,就是增加了相应的检查和处理,使之能处理较大的INI,
+50
科创币
phpskycn
2013-08-02
赞,,可惜俺对D不熟悉……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}