zoukankan      html  css  js  c++  java
  • 一个奇怪的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;
    好怪,再研究一下。。

  • 相关阅读:
    shell管道和重定向
    shell脚本
    Hexo学习笔记--常用命令及部署步骤
    Git学习笔记--Git常用命令
    Spark link集合
    Struts2学习笔记--Struts2的体系结构
    JNI错误记录--JNI程序调用本地库时JVM崩溃
    Hibernate学习笔记--使用ThreadLocal
    Hibernate学习笔记--核心编程
    Hibernate学习笔记--映射配置文件详解
  • 原文地址:https://www.cnblogs.com/yanyyx/p/1571354.html
Copyright © 2011-2022 走看看