gpt4 book ai didi

c++ - ERROR_NOT_ENOUGH_MEMORY 使用 WritePrivateProfileString 写入 INI 时出错,调用 200k 次后

转载 作者:行者123 更新时间:2023-11-28 03:32:46 25 4
gpt4 key购买 nike

我正在使用 C++ 制作简单的 dll 数据包嗅探器,它将挂接到应用程序,并将接收到的数据包写入 INI 文件。不幸的是,在 20-30 分钟后,主要应用程序崩溃了。

当接收到数据包时,receivedPacket() 将被调用。 20 多分钟后,WriteCount 值约为 150,000-200,000.. 并开始出现 C++ 运行时错误/崩溃,GetLastError() 我得到的代码是 0x8,这是ERROR_NOT_ENOUGH_MEMORYWritePrivateProfileStringA() 返回 0

void writeToINI(LPCSTR iSec,LPCSTR iKey,int iVal){
sprintf(inival, _T("%d"), iVal);
WritePrivateProfileStringA(iSec,iKey,inival,iniloc);

//sprintf(strc, _T("%d \n"), WriteCount);
//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), strc, strlen(strc), 0, 0);

WriteCount++;

}

void receivedPacket(char *packet,WORD size){
switch ( packet[2] )
{
case 0x30:
// Size : 0x5F
ID = *(signed char*)&packet[0x10];
X = *(signed short*)&packet[0x20];
Y = *(signed short*)&packet[0x22];
Z = *(signed short*)&packet[0x24];

sprintf(inisec, _T("PACKET_%d"), (ID+1));

writeToINI(inisec,"id",ID);
writeToINI(inisec,"x",X);
writeToINI(inisec,"y",Y);
writeToINI(inisec,"z",Z);
}

[.....OTHER CASES.....]

}

谢谢:)

最佳答案

WritePrivateProfileString()GetPrivateProfileString() 非常慢(由于每次调用都解析 INI 文件),您可以:

  • 使用现有解析之一 libraries ,但我不确定内存效率或支持顺序写入。
  • 编写您自己的顺序 INI 编写器:
    1. 读取文件(或者只读取一部分,如果文件太大的话)
    2. 找到节和键(如果没有找到,在文件末尾创建新节,或者找到插入位置,如果你想要排序的节),保存键和下一个键的文件位置
    3. 改变值(value)
    4. 保存(原文件开头到键的位置+实际更改的键+原文件中下一个键的位置到文件末尾)(如果在末尾创建了新节,您可以简单地将新节附加到原始文件)(如果数据包经常重写相同的 ID,您可以在每个键后添加填充空格,大到可以容纳所需类型的任何值(例如:将 X=1---\n 更改为 X=100 -\n(将 - 更改为空格),因此您的 key 大小不变,您可以 update only part of file ) )
  • 数据库,例如MySQL
  • 编写二进制文件(最快的解决方案)并编写程序读取值,或转换为文本

小提示:几年前我用GetPrivateProfileString()读取设置文件(大约1KB大小),从HDD读取:50ms,从U盘读取:1000ms!,更改后( 1. 将文件读取到内存 2. 运行我自己的解析器)它在 HDD 和 USB 上都在 1ms 内运行。

关于c++ - ERROR_NOT_ENOUGH_MEMORY 使用 WritePrivateProfileString 写入 INI 时出错,调用 200k 次后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com