SetLength的替代品

Ben*_*iss -1 delphi dynamic

我遇到了这个SetLength命令的问题.

这基本上是这个问题:

WindowsAPI只和我一起工作.我的目标是将一定大小设置为动态的字符数组:

以下是一些需要了解的代码:

var
thefile : array of char;
// or thefile : array [0..9999] of char; // <---- not really a good way, works tho

FileHandle := CreateFileA(paramstr0, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
dwSize := GetFileSize(FileHandle,NIL);
SetFilePointer(FileHandle, 0, nil, FILE_BEGIN);
SetLength(TheFile, dwsize); // <--- I can't use this
ReadFile(FileHandle, thefile[1], dwSize , dwRead, nil);
CloseHandle (FileHandle);
CloseHandle(CreateFileA (sfile, 0, 0,NIL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0));
FileHandle := CreateFileA(sFile, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
WriteFile (FileHandle, thefile, dwSize, testCardinal, NIL);
CloseHandle (FileHandle);
Run Code Online (Sandbox Code Playgroud)

我怎样才能更换SetLength?我还想了解Windows/Delphi如何在内存中分配数组等.感谢您的帮助

RRU*_*RUZ 8

你的代码中有几个缺陷

  1. 使用CreateFile函数时,必须根据INVALID_HANDLE_VALUE检查返回的句柄.

  2. 总是你必须使用try ..终于释放资源.

  3. 您正在尝试使用ReadFile函数thefile使用索引1 读取缓冲区内的内容 ,这是错误的,您必须使用索引0,因为动态数组是基于零索引的.

  4. 您正在使用此代码

CloseHandle(CreateFileA(sfile,0,0,NIL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0));

要创建一个空文件,然后再使用CreateFile函数打开和写入文件,您可以一步完成相同的操作

  FileHandle := CreateFileA(sFile, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_NEW, 0, 0);
Run Code Online (Sandbox Code Playgroud)

试试这个改进版的代码.

顺便说一句,使用SetLengh没有任何问题,问题在第3点解释.

var
  thefile : array of AnsiChar;
begin

  FileHandle := CreateFileA(paramstr0, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if FileHandle <> INVALID_HANDLE_VALUE then
  try
    dwSize := GetFileSize(FileHandle, nil);
    SetFilePointer(FileHandle, 0, nil, FILE_BEGIN);
    SetLength(TheFile, dwsize);
    ReadFile(FileHandle, thefile[0], dwSize , dwRead, nil);
  finally
    CloseHandle (FileHandle);
  end;

  FileHandle := CreateFileA(sFile, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_NEW, 0, 0);
  if FileHandle <> INVALID_HANDLE_VALUE then
  try
    WriteFile (FileHandle, thefile[0], dwSize, testCardinal, nil);
  finally
    CloseHandle (FileHandle);
  end;

  SetLength(TheFile, 0);    
end;
Run Code Online (Sandbox Code Playgroud)