【问题标题】:Exception on AccessViolation when trying to load library [duplicate]尝试加载库时出现 AccessViolation 异常 [重复]
【发布时间】:2013-09-11 13:24:48
【问题描述】:

我正在尝试在我的 Delphi 项目中加载一个库,该库可以位于两个位置。所以要加载它,我使用以下代码:

  try
    FHandle:=LoadLibrary(('some\address'));
  except on EAccessViolation do
    FHandle:=LoadLibrary(('another\address'));
  end;

但是,我遇到了一个问题,因为它永远不会到达异常,我收到错误说存在访问冲突,但它没有尝试从其他地址加载...

有人知道原因吗?

谢谢,

【问题讨论】:

  • LoadLibrary Windows API 仅在出错时返回 NULL。
  • 但是我应该用什么来跟踪这个错误并让它有一个例外呢?
  • 如果第一个 LoadLibrary 返回 NULL(FHandle 为 NULL),用另一个文件名再次调用 LoadLibrary。
  • 为什么这个问题受到保护?我相信@ChrisF 有美好的一天
  • @ChrisF 似乎有很多垃圾邮件的答案,关于很多问题的问题都进入了网站。我想知道是否可以采取更多措施从源头上阻止它们。我的意思是,感谢所有与他们打交道的辛勤工作,但我相信你们钻石模组更愿意做其他事情。

标签: delphi exception dll exception-handling


【解决方案1】:

LoadLibrary 不会引发异常。它是一个 Win32 函数。咨询documentation,如果失败,您会看到它返回NULL。

你的代码应该是:

FHandle := LoadLibrary('some\address');
if FHandle = 0 then
  FHandle := LoadLibrary('another\address');
if FHandle = 0 then
  // handle the error, probably by raising an exception

另一种选择可能是使用FileExists 检查您的哪些可能位置包含该文件。

【讨论】:

    【解决方案2】:

    补充大卫的答案,如果函数确实返回 null 即失败,您可以使用 GetLastError() 得到错误,请参阅:

    http://msdn.microsoft.com/en-us/library/ms679360.aspx

    可以在此处找到错误代码列表:

    http://msdn.microsoft.com/en-us/library/ms679360.aspx

    您可以使用 GetLastError 的结果通过有意义的异常类型和描述自行引发和异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2018-07-07
      • 2016-07-08
      • 2020-09-02
      • 2023-03-14
      相关资源
      最近更新 更多