PinvokesTack--带offreg.dll的C#(windows ddk7)
我正在尝试使用windows ddk 7软件包中提供的offreg.dll在内存中创建脱机注册表 您可以在此处找到有关offreg.dll的更多信息: 当前,在尝试使用OrCreateChive创建配置单元时,我收到以下错误: “托管调试助手‘PinvokeStackDistancert’检测到问题。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。” 这是包含OrCreateChive的offreg.h文件:PinvokesTack--带offreg.dll的C#(windows ddk7),c#,registry,pinvoke,dll,C#,Registry,Pinvoke,Dll,我正在尝试使用windows ddk 7软件包中提供的offreg.dll在内存中创建脱机注册表 您可以在此处找到有关offreg.dll的更多信息: 当前,在尝试使用OrCreateChive创建配置单元时,我收到以下错误: “托管调试助手‘PinvokeStackDistancert’检测到问题。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。” 这是包含OrCreateChive的offreg.h文件:
typedef PVOID ORHKEY;
typedef ORHKEY *PORHKEY;
VOID
ORAPI
ORGetVersion(
__out PDWORD pdwMajorVersion,
__out PDWORD pdwMinorVersion
);
DWORD
ORAPI
OROpenHive (
__in PCWSTR lpHivePath,
__out PORHKEY phkResult
);
DWORD
ORAPI
ORCreateHive (
__out PORHKEY phkResult
);
DWORD
ORAPI
ORCloseHive (
__in ORHKEY Handle
);
以下是我试图调用.dll并创建指针以备将来使用的C#代码。
using System.Runtime.InteropServices;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORCreateHive", SetLastError=true, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr ORCreateHive2();
private void button1_Click(object sender, EventArgs e)
{
try
{
IntPtr myHandle = ORCreateHive2();
}
catch (Exception r)
{
MessageBox.Show(r.ToString());
}
}
}
}
我过去能够使用user32.dll、icmp.dll等创建指针,没有任何问题。但是,我在offreg.dll上没有这样的运气
多谢各位 将其更改为
extern int ORCreateHive (out IntPtr phkResult);
您需要在托管签名中添加一个参数以匹配本机签名
[DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORCreateHive", SetLastError=true, CallingConvention = CallingConvention.StdCall)]
public static extern uint ORCreateHive2(out IntPtr notUsed);
另外,如果密钥作为out参数返回,那么代码应该如下所示
IntPtr myHandle;
uint ret = ORCreateHive2(out myHandle);
if ( ret == 0 ) {
return myHandle;
} else {
// Error ...
}
@Michael很好,我专注于参数,错过了不正确的DWORD转换。将其切换为
uint