• 一个奇怪的DLL调用问题


    我使用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;
    好怪,再研究一下。。

  • 相关阅读:
    Internet Explorer 11:不要再叫我IE
    C#汉字转拼音
    winfrom设置当前画面始终显示在最前面
    解决 winform打开网页 和WebBrowser打开链接360误报拦截的问题
    dataGridView使用指南系列一、回车换行或换列完美解决方案
    C#--WinForm项目主窗体设计
    C#后台解析 json 动态解析 通用(Dictionary)
    在windows下安装git中文版客户端并连接gitlab
    检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)
    关闭窗体后,进程仍然在运行的问题重现与解决
  • 原文地址:https://www.cnblogs.com/yanyyx/p/1571354.html
Copyright © 2020-2023  润新知