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

  • 相关阅读:
    设置标题自适应宽度,动态调整大小
    终止延迟函数
    iOS 关于音频开发
    阻止iOS设备锁屏
    苹果开发——设置iTunes Connect中的Contracts, Tax, and Banking
    【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
    uibutton 设置title 居左显示
    通过view 获取viewController
    tableview 自动滑动到某一行
    uibutton 设置圆角边框
  • 原文地址:https://www.cnblogs.com/yanyyx/p/1571354.html
Copyright © 2011-2022 走看看