Delphi 为什么LoadLibrary仅在从IDE启动EXE时失败?

Delphi 为什么LoadLibrary仅在从IDE启动EXE时失败?,delphi,dll,delphi-2009,Delphi,Dll,Delphi 2009,关于Delphi 2009,关于一个新的VCL项目: procedure TForm1.FormCreate(Sender: TObject); var Handle: THandle; begin Handle := loadlibrary('oci.dll'); if Handle <> 0 then begin try ShowMessage('Success'); finally

关于Delphi 2009,关于一个新的VCL项目:

procedure TForm1.FormCreate(Sender: TObject);
var
    Handle: THandle;
begin
    Handle := loadlibrary('oci.dll');
    if Handle <> 0 then
    begin
        try
            ShowMessage('Success');
        finally
            FreeLibrary(Handle);
        end;
    end
    else
        ShowMessage('Fail');
end;
过程TForm1.FormCreate(发送方:TObject);
变量
手柄:坦德尔;
开始
句柄:=loadlibrary('oci.dll');
如果句柄为0,则
开始
尝试
ShowMessage(“成功”);
最后
免费图书馆(句柄);
结束;
结束
其他的
ShowMessage('Fail');
结束;
如果我从IDE运行Exe,它会失败;如果我从目录运行Exe,只要双击它,它就成功了

请告诉我我错过了什么

谢谢, 弗雷德


编辑:通过IDE启动EXE与Delphi 7一起工作!!如果依赖DLL位于同一目录中,则D2009的问题在于WTf。。。确保你的启动目录在它上面


在Visual Studio中,我也经常遇到这种情况…

如果依赖DLL位于同一目录中。。。确保你的启动目录在它上面


我在Visual Studio中也经常遇到这种情况…

LoadLibrary失败的常见问题是所需的DLL不在目录中。可能是D2009出于某种原因没有搜索相同的文件夹

为了确保这一点,您应该使用类似于

ShowMessage(SysErrorMessage(GetLastError));
请尝试(甚至暂时)将“oci.dll”与项目的.EXE放在同一目录中,然后重试

以下是一些需要检查的内容:

  • oci.dll位于哪个目录中
  • “PATH”环境变量中是否包含该目录?如果没有,试试看
  • 您是否在Delphi Tools/Options/Env variables屏幕中为路径设置了覆盖

    • LoadLibrary失败的常见问题是所需的DLL不在目录中。可能是D2009由于某种原因没有搜索相同的文件夹

      为了确保这一点,您应该使用类似于

      ShowMessage(SysErrorMessage(GetLastError));
      
      请尝试(甚至暂时)将“oci.dll”与项目的.EXE放在同一目录中,然后重试

      以下是一些需要检查的内容:

      • oci.dll位于哪个目录中
      • “PATH”环境变量中是否包含该目录?如果没有,试试看
      • 您是否在Delphi Tools/Options/Env variables屏幕中为路径设置了覆盖

      我怀疑独立调用是有效的,因为DLL恰好位于当前目录中

      并且,从IDE启动时,当前目录与EXE目录不同


      您是否尝试使用DLL的完整路径(例如,ParamStr(0)的路径加上DLL名称)?

      我怀疑独立调用可以工作,因为DLL恰好位于当前目录中

      并且,从IDE启动时,当前目录与EXE目录不同


      您是否尝试使用DLL的完整路径(即,类似于ParamStr(0)的路径加上DLL名称)?

      oci.DLL所在的目录(系统和用户路径),并且移动DLL不是选择的选项me@Fred. 理解-但是临时移动(或复制)dll将确认这就是问题所在。然后我们可以寻找解决方案…GetLastError返回代码是87,似乎是“不正确的参数”错误_MOD_NOT_FOUND 126 0x7E找不到指定的模块。该路径可以自由编辑,因为它值得-项目选项|调试器|环境块。您可以直接在其中删除覆盖,而不是在注册表中乱搞。oci.dll所在的目录位于路径(系统和用户路径)中,移动dll不是选择me@Fred. 理解-但是临时移动(或复制)dll将确认这就是问题所在。然后我们可以寻找解决方案…GetLastError返回代码是87,似乎是“不正确的参数”错误_MOD_NOT_FOUND 126 0x7E找不到指定的模块。该路径可以自由编辑,因为它值得-项目选项|调试器|环境块。您可以直接在其中删除覆盖,而不是在注册表中乱搞。谢谢,但dll位于系统路径中,与EXE不在同一目录中谢谢,但dll位于系统路径中,与EXE不在同一目录中LoadLibrary发生故障时,GetLastError告诉您原因是什么?GetLastError返回代码是87,当LoadLibrary失败时,它似乎是“不正确的参数”,GetLastError告诉您原因是什么?GetLastError返回代码是87,它似乎是“不正确的参数”