【问题标题】:"SetupOpenInfFile" getting access violation error in Delphi2010“SetupOpenInfFile”在 Delphi2010 中出现访问冲突错误
【发布时间】:2011-02-13 07:57:03
【问题描述】:

在 Delphi 2010 中使用以下行代码时,出现“访问冲突”错误,但相同的代码在 VC++ 中运行良好。

Delphi 2010 代码是

var
  hMyInf : HINF;
begin
hMyInf := SetupOpenInfFile('.\\DIGIMHID.INF','Mouse', INF_STYLE_WIN4,Nil);

VC++代码是

hMyInf = SetupOpenInfFile(".\\DigimHID.inf", "Mouse", INF_STYLE_WIN4, NULL);

请帮我解决这个问题。 谢谢大家。

【问题讨论】:

  • 显示 SetupOpenInfFile 的 Delphi 声明。
  • TSetupOpenInfFileW = function(const FileName: PWideChar; const InfClass: PWideChar; InfStyle: DWORD; ErrorLine: PUINT): HINF; stdcall;
  • Delphi 调用中的双反斜杠的一个问题:C++ 版本使用它来转义 `` 所以最终文本只包含一个; Delphi 版本不使用 '\' 作为转义字符,因此您实际上会得到两个反斜杠。但这通常不是问题,显然 Windows 可以容忍这一点;即使没有,错误也不会是 AV。您在哪里找到 TSetupOpenInfFileW 定义?我想试试你的代码,但找不到。
  • 以上还不够——我没有看到错误。展示可以编译的Delphi代码示例。
  • 因为你得到一个 AV 我怀疑无效的内存访问是在 Delphi 端完成的(在控制传递给SetupOpeninfFile 例程之前);根据您的声明,我怀疑SetupOpenInfFile 不是一个简单的导入方法,它是一个函数指针并且它没有被初始化。把它放在你的函数调用之前:if not Assigned(SetupOpenInfFile) then raise Exception.Create('It''s a function pointer and it''s not initialized');。如果引发异常,请在您正在使用的单元中搜索函数名称,查找分配。你可能需要调用一些东西来初始化。

标签: delphi setupapi


【解决方案1】:

在使用SetupAPI.pas 中的任何方法之前调用LoadSetupAPI

编辑,提供一些背景知识:正如大卫在他的回答和我在我的评论中同时写的那样,错误可能是由调用未初始化的方法指针引起的。对我来说,第一个提示是错误消息,访问冲突:如果访问冲突的等价物来自 Windows 本身,它会被称为Runtime Error 216。代码很简单,只使用了常量和一个方法调用。常量不能生成 AV,所以错误必须来自方法本身,或者来自调用方法。

由于提供的 Delphi 声明显示了“函数类型”,我怀疑 SetupOpenInfFile 实际上是一个方法指针,而不是 import 方法。这些指针需要以某种方式进行初始化。搜索SetupAPI.pas(感谢google 提供链接,因为我不使用JEDI 库)我很快发现它是从LoadSetupAPI 分配的。我的第一个想法是:LoadSetupAPI 不是从initialization 部分调用的吗?它不是,所以它需要从代码中调用。 问题已解决。

【讨论】:

  • +1 这样就可以完成工作了!!我假设这将由 initialization 部分完成 - 对 JEDI 代码没有太多经验。
  • 谢谢大家,我只是在调用SetupOpenInfFile 之前调用LoadSetupAPI 函数。现在它工作正常。这是方法指针问题。非常感谢我的朋友们。
  • @David,我不认为任何 JEDI 单位;我搜索了代码,搜索了函数名称,发现它是从LoadSetupAPI 分配的。初始化部分没有调用任何内容,还有一个 UnloadSetupAPI 方法,也许 JEDI 家伙有理由不从初始化中调用 LoadSetupAPI
  • @Cosmin 我猜原因是允许调用者选择从不调用它。
  • @Able 请接受答案!!您尚未在 Stack Overflow 上接受任何答案!这对我们来说有点忘恩负义。
【解决方案2】:

你的文件名在 Delphi 版本中是错误的。你不会在 Delphi 中逃避 \ ,一个人就可以了。但这不会导致访问冲突。

我的猜测是您的 GetProcAddress 调用失败。但这是一个猜测。我想查看更多代码和完整的错误消息。

编辑

看来我们走在了正确的轨道上。 Cosmin 的回答将为您解决问题。另一种方法是通过删除SetupApi.pas 中条件SETUPAPI_LINKONREQUEST 的定义来切换到隐式链接。

【讨论】:

  • @cosmin 我在手机上输入了这个,所以没有看到你的评论。我同意你在评论中所说的一切。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多