【问题标题】:PInvokeStackImbalance -- C# with offreg.dll ( windows ddk7 )PInvokeStackImbalance - 带有 offreg.dll 的 C# ( windows ddk7 )
【发布时间】:2010-03-24 20:29:45
【问题描述】:

我正在尝试使用 windows ddk 7 包中提供的 offreg.dll 在内存中创建离线注册表。

您可以在此处找到有关 offreg.dll 的更多信息: MSDN

目前,在尝试使用 ORCreateHive 创建配置单元时,我收到以下错误:

“托管调试助手 'PInvokeStackImbalance' 检测到问题。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。”

这是包含 ORCreateHive 的 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 时没有这样的运气。

谢谢。

【问题讨论】:

    标签: c# registry pinvoke dll


    【解决方案1】:

    您需要在托管签名中添加一个参数以匹配本机签名。

    [DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORCreateHive", SetLastError=true, CallingConvention = CallingConvention.StdCall)]
    public static extern uint ORCreateHive2(out IntPtr notUsed);
    

    同样考虑到键是作为输出参数返回的,你的代码应该如下所示

    IntPtr myHandle;
    uint ret = ORCreateHive2(out myHandle);
    if ( ret == 0 ) { 
      return myHandle;
    } else {
      // Error ...
    }
    

    【讨论】:

    • @Michael 很好,我专注于参数并错过了不正确的 DWORD 转换。将其切换为uint
    【解决方案2】:

    改成

    extern int ORCreateHive (out IntPtr phkResult);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多