在dll中调用两次TStringList.LoadFromFile会给第二次调用提供空列表

时间:2017-09-18 15:46:28

标签: delphi dll delphi-7

我将一些代码从可执行项目移动到DLL项目。两者都是Delphi 7项目。 其中一个函数将文本文件加载到TStringList对象并迭代它以搜索某些信息。此函数(KeyManager)由同一DLL内的另一个函数调用。

我遇到的问题是,当我在第二个(或更多)时间内调用此函数时,字符串列表为空(Count等于零)。 FileExists告诉我文件在那里(我检查了它的内容,它就在那里)。第一次调用该函数时,列表填充正常并且代码可以正常工作。为了让它再次起作用,我必须完成该过程并再次执行它。

将dll静态加载到进程中。

我不知道如何解决这个问题,因为我不知道是什么导致了这个问题。这段代码曾经在EXE应用程序中实现时工作,所以我想这与在DLL中实现它有关。

Bellow是失败的代码。删除的部分未执行,因为keyStrings.Count为0,因此for循环不会执行。

var SLEKEYFILE : string = 'slekeys.keys';

function KeyManager(rw:TReadWriteOP; KeyType : TSleKeyType; var KeyRecord : TSleKeys) : integer;
var
  line : integer;
  keyFileName : string;
  keyStrings : TStringList;
  keyFile : file;
  lineKeyId : Word;
  lineKeyType : byte;
  index : integer;
  temp,temp2 : ansistring;
  RecordStr : ansistring;
  reqKeyId : integer;

begin
  keyFileName := SLEKEYFILE;
  if not FileExists(keyFileName) then
  begin
    // File does not exist. Create.
    AssignFile(keyFile, keyFileName);
    Rewrite (keyFile);
    CloseFile(keyFile);
  end; // not File exists
  keyStrings := TStringList.Create;
  try
    keyStrings.LoadFromFile(keyFileName); // <<-- Only works the first time  called
    if rw = OpRead then
    begin
      Result := $01 OR $02; // keys are not found

      for line := 0 to keyStrings.Count-1 do
      begin
        //  Sanity check
        if Length(keyStrings[line]) = 0 then continue;
        // Other information is read. This part is not executed because Count is 0 the second time KeyManager() is called.
      end; // for
    end
    else  // rw
    begin // inserção da chave
      // Insert information in file - not executed/relevant to the question
    end; // rw

  finally
    keyStrings.Free;
  end; // try
end;

我无法确定我是否做了明显错误的事情。如何解决此问题,并使LoadFromFile过程始终有效?

0 个答案:

没有答案