type //装载插件时赋值
  TPlugIn = class
    Address: THandle;
    CallGetPlugInsName: Pointer;
    CallOpen: Pointer;
    CallSendCode: Pointer;
    CallCheckAlarm: Pointer;
  end;procedure LoadPlugIn(Dir: string);
var
  Files: TStrings;
  i: integer;
  PlugIn: TPlugIn;
begin
  Files := TStringList.Create;
  SearchFileEx(Dir, '.dll', Files);
  for i := 0 to Files.Count - 1 do
  begin
    PlugIn := TPlugIn.Create;
    PlugIn.Address := LoadLibrary(PChar(Files[i]));
    if PlugIn.Address = 0 then //装载插件信息进PlugIn;
      raise EDllLoadError.Create('装载' + PChar(Files[i]) + '失败');
    try
      PlugIn.CallGetPlugInsName := GetProcAddress(PlugIn.Address, 'GetPlugInsName');
      PlugIn.CallOpen := GetProcAddress(PlugIn.Address, 'Open'); ;
      PlugIn.CallSendCode := GetProcAddress(PlugIn.Address, 'SendCode');
      PlugIn.CallCheckAlarm := GetProcAddress(PlugIn.Address, 'CheckAlarm');
      PlugInsInfo.Add(PlugIn);
    except
      raise EDllLoadError.Create('初始化插件失败');
    end;
  end;
  Files.Free;
end;procedure FreePlugIn;
var
  i:integer;
begin
  for i:=0 to PlugInsInfo.Count-1  do
  begin
    FreeLibrary(TPlugIn(PlugInsInfo[0]).Address);
  end;
  PlugInsInfo.Free ;
end;
问题是为什么释放FreeLibrary第一个地址是对的,到第二个就报内存错误???

解决方案 »

  1.   

    for i:=0 to PlugInsInfo.Count-1  do
      begin
        FreeLibrary(TPlugIn(PlugInsInfo[0]).Address);
                                        ^ -> 改为 i
      end;
      PlugInsInfo.Free ;
      

  2.   

    地址一样,问题是这样的,如果把type //装载插件时赋值
      TPlugIn = class
        Address: THandle;
        CallGetPlugInsName: Pointer;
        CallOpen: Pointer;
        CallSendCode: Pointer;
        CallCheckAlarm: Pointer;
      end;
    那些指针都去掉,则正常,即
    TPlugIn = class
        Address: THandle;
    end;
    但这样满足不料我的要求阿
      

  3.   

    已经解决,谢谢楼上的帮助,主要是少写了一句话。
    PlugInsInfo.Add(PlugIn);
        
    PlugIn.free;