PinvokesTack--带offreg.dll的C#(windows ddk7)

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文件:

我正在尝试使用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