SetupVerifyInfFile-参数不正确。如何使用C#pinvoke
我在呼叫/执行方面有问题。SetupVerifyInfFile-参数不正确。如何使用C#pinvoke,c#,pinvoke,C#,Pinvoke,我在呼叫/执行方面有问题。 调用VerifyInfFile函数时,收到异常“参数不正确” [DllImport(“setupapi.dll”,CharSet=CharSet.Auto,SetLastError=true)] 私有静态外部bool setupverifyinff文件( 字符串文件名, IntPtr AltPlatformInfo, 参考IntPtr InfSignerInfo); [StructLayout(LayoutKind.Sequential)] 公共结构SP\u INF\
调用
VerifyInfFile
函数时,收到异常“参数不正确”
[DllImport(“setupapi.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部bool setupverifyinff文件(
字符串文件名,
IntPtr AltPlatformInfo,
参考IntPtr InfSignerInfo);
[StructLayout(LayoutKind.Sequential)]
公共结构SP\u INF\u签名者\u INFO
{
公共机构的规模;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串目录文件;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串数字签名者;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串数字签名;
}
公共静态void VerifyInfFile(字符串infPath)
{
SP_INF_SIGNER_INFO infSignerInfo=默认值;
infSignerInfo.CbSize=Marshal.SizeOf(infSignerInfo);
var infSignerPtr=Marshal.AllocHGlobal(infSignerInfo.CbSize);
尝试
{
Marshal.StructureToPtr(infSignerInfo,infSignerPtr,false);
如果(!SetupVerifyInfFile(infPath,IntPtr.Zero,ref infSignerPtr))
抛出新异常(“调用SetupVerifyInfFile()时出错”,新建
Win32Exception(Marshal.GetLastWin32Error());
}
最后
{
弗里赫全球元帅(infSignerPtr);
}
}
我可以看到四个明显的错误:
ref IntPtr InfSignerInfo
传递的第三个参数。将其作为ref
传递是错误的。如文档所述,此参数是指向结构的指针。因此,您需要删除ref
SP\u INF\u SIGNER\u INFO
指定字符集,因此将获得默认字符集,即ANSI。这与函数声明中的CharSet.Auto
不匹配CbSize
使用了错误的值。您可以提供指针的大小,但需要提供结构的大小,Marshal.SizeOf(typeof(SP\u INF\u SIGNER\u INFO))
MAX\u PATH
使用了不正确的值。正确的值是260,而不是256Marshal.SizeOf(对象)
已过时。如果改用Marshal.SizeOf()
会发生什么?我检查了这个,得到了相同的错误。我不确定我是否100%很好地实现了INF\u SIGNER\u INFO结构或SetupVerifyInfFile方法。如果参数正确,则不会出现这种异常。也就是说:断言/假设可能不正确。我从ref InfSignerInfo
中删除了ref
。我还将CharSet.Auto
添加到SP\u INF\u SIGNER\u INFO
。现在它看起来像[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
。错误仍然出现。我做了您在第3点中所写的,但不幸的是,相同的错误仍在继续。对您更有用的是了解我如何调试所有这些。我创建了一个平凡的C++程序,它做同样的事情,并工作。通过检查CbSize
的值,我得出了第4点。