本帖最后由 kv2002 于 2011-06-03 09:56:30 编辑

解决方案 »

  1.   

    问题不少
    FDLLList.Add(sName+'='+IntToStr(h));FreeLibrary(StrToInt(FDllList.Strings[i]); 首先这里StrToInt肯定要出错
    因为FDllList.Strings[i]并不是一个整数第二个
    @obj:= GetProcAddress(h, 'TestObj');
    GetProcAddress只返回函数地址,并不是函数执行结果
    因此应该是
    Type
      TTestObj = Function:ITest;stdcall; //此函数为DLL导出函数,所有DLL都提供
    var
      P : TTestObj;
    begin
      ....
      P := GetProcAddress(h, 'TestObj');
      if Assigned(P) then begin
        Obj := P();
        if Obj<>NIL then 
          ...
      end;
      for i := FDllList.Count-1 downto 0 do
      begin
        FreeLibrary(StrToInt(FDllList.Strings[i]);  //这里会报错
        FDllList.Delete(i);   //这句完全多余
      end;
      FDllList.Free;
      

  2.   

    建议 最好是在一个程序动态加载那个DLL文件试试,看看有没有错误
      

  3.   

    忙中出错,代码贴错了。
    FreeLibrary(StrToInt(FDllList.Strings[i]);  
    实际代码为
    FreeLibrary(StrToInt(FDllList.Values[FDllList.Names[i]]));//这里会报错to kiboisme:
       我先按照你的建议去修改下试试。
      

  4.   

        //获取插件目录下的所有DLL文件名
        SearchFile(sPath,'*.dll',FileList);
        if FileList.Count > 0 then
        for i := 0 to FileList.Count-1 do
        begin
          h := loadlibrary(PChar(FileList.Strings[i]));///1、h 在此处为 dll的句柄
          if h >0 then
          begin
            @obj:= GetProcAddress(h, 'TestObj');//2、h 在此处变为 函数的句柄
            if @obj <> nil then
            begin
              sName := ExtractFileName(FileList.Strings[i]);
              // DLLName = DLLHandle
              FDLLList.Add(sName+'='+IntToStr(h));//添加的是函数的句柄
              obj.GetVersion(sVersion);
            end
            else
              FreeLibrary(h);
          end;
        end;
    最后的地方
    FreeLibrary(StrToInt(FDllList.Strings[i]); //你应该是想释放dll的句柄,但是根据你的代码是释放的函数的句柄建议把1跟2处不要用同一个参数,会更容易理解些
      

  5.   

    FARPROC GetProcAddress(    HMODULE hModule, // handle to DLL module  
        LPCSTR lpProcName  // name of function 
       );
    楼上的兄弟,我的代码里 h 一直是DLL句柄
      

  6.   

    去掉 FreeAndNil(FTestServer);
    你的对象以接口形式给别人用.当别人用完引用计数变成0的时候你对象就会被释放. FreeAndNil(FTestServer);就重复释放了,当然会报错.