“SetupOpenInfFile”在Delphi2010中获取访问冲突错误

时间:2011-02-13 07:57:04

标签: delphi setupapi

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

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

2 个答案:

答案 0 :(得分:4)

在使用LoadSetupAPI

中的任何方法之前,请先致电SetupAPI.pas

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

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

答案 1 :(得分:2)

您的文件名在Delphi版本中是错误的。你不会在Delphi中逃脱,只有一个人会这样做。但这不会导致访问违规。

我的猜测是你的GetProcAddress调用失败了。但这是猜测。我想看到更多代码和完整的错误消息。

修改

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