yanyyx

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
我使用DLL封装了数据库操作对象,使用一直都没有问题。
这几天需要在DLL里作一些操作:对每一个目录下的DLL进行一次动态加载,并调用一个函数,来进行判断。
代码如下:


var
  i : Integer;
  Ask : Boolean;
  FileName, DllFile : String;
  tmList : TList;  { 通过校验的文件列表 }
begin
  tmList := TList.Create;
  { 是否有不使用的文件版本信息,有则删除 }
  { 删除非系统文件类型 }
  (* *)
  with FClientDataSet do
  begin
    try
      if EnLib = 0 then
        EnLib := LoadLibrary(Encode_DLL);
      if EnLib = 0 then
        raise EDLLLoadError.Create(Encode_DLL + LoadFileErr)
      else
      begin
        @procGetFileVerify := GetProcAddress(EnLib, 'F0001');
        if Assigned(procGetFileVerify) then
        begin
        end;
      end;

      First;
      while not Eof do
      begin
        Ask := False;
        for i := 0 to aList.Count - 1 do
        begin
          { 删除非系统文件类型 }
          if CompareText(PFileNode(aList.List^[i]).FileName, Fields.FieldByName('FileName').Value) = 0 then
          begin
            DllFile := PFileNode(aList.List^[i]).FilePath + PFileNode(aList.List^[i]).FileName;
            FileName := PFileNode(aList.List^[i]).FileName;

            try
              if dllLib = 0 then
                dllLib := LoadLibrary(PChar(DllFile));
              if dllLib = 0 then
              //  raise EDLLLoadError.Create(DllFile + LoadFileErr)
              else
              begin
                @procGetFileVInfo := GetProcAddress(dllLib, 'FM0001');
                if Assigned(procGetFileVInfo) then
                  { 进行校验 }
                  if procGetFileVerify(PChar(FileName), procGetFileVInfo) then
                  begin
                    tmList.Add(aList.List^[i]);
                    Ask := True;
                    Break;
                  end;
              end;
            finally
              FreeLibrary(dllLib);
              dllLib := 0;
            end;
          end;
        end;
        if not Ask then
          Delete
        else
          Next;
      end;

    finally
      FreeLibrary(EnLib);
      EnLib := 0;
    end;
  end;
.....
我的数据库操作DLL是通过别的文件来调用的,是以加载的,现在只是加载一次,返回个值,然后释放掉。。
从DLL的理论上来说,我这个DLL只是引用+1,释放-1。
但是,我程序中数据库操作对象一直加载中,关闭,不释放,再开启那么报 "mismatch in datapacket" 错误。
报错代码段
  FClientDataSet.Active := True;
好怪,再研究一下。。

posted on 2009-09-21 20:56  Yanyyx  阅读(839)  评论(1编辑  收藏  举报