3

在 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);

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

4

2 回答 2

4

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

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

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

于 2011-02-13T08:44:14.933 回答
2

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

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

编辑

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

于 2011-02-13T08:22:49.127 回答