在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);
请帮我解决这个问题。 谢谢大家。
答案 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
的定义来切换到隐式链接。