【发布时间】:2012-05-30 13:34:44
【问题描述】:
DWORD OREnumKey(
__in ORHKEY Handle,
__in DWORD dwIndex,
__out PWSTR lpName,
__inout PDWORD lpcName,
__out_opt PWSTR lpClass,
__inout_opt PDWORD lpcClass,
__out_opt PFILETIME lpftLastWriteTime
);
我的代码
[DllImport("offreg.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern uint OREnumKey(IntPtr Handle, IntPtr dwIndex, [MarshalAs(UnmanagedType.LPWStr)]out StringBuilder lpName, ref IntPtr lpcName, [MarshalAs(UnmanagedType.LPWStr)]out StringBuilder lpClass, ref IntPtr lpcClass, out System.Runtime.InteropServices.ComTypes.FILETIME lpftLastWriteTime);
IntPtr myKey = hiveid;
IntPtr dwindex=(IntPtr)0;
StringBuilder lpName=new StringBuilder("",255);
IntPtr lpcName = (IntPtr)0;
StringBuilder lpClass=new StringBuilder("",255);
IntPtr lpcClass = (IntPtr)11;
System.Runtime.InteropServices.ComTypes.FILETIME lpftLastWriteTime;
uint ret3 = OREnumKey(myKey, dwindex, out lpName, ref lpcName, out lpClass, ref lpcClass, out lpftLastWriteTime);
ret3=ERROR_MORE_DATA 234
问题可能出在错误的 StringBuilder 大小或 FILETIME
第二我应该如何从 C# 调用 PWSTR 参数?
[MarshalAs(UnmanagedType.LPWStr)]out StringBuilder lpName对吗?
【问题讨论】:
-
这会给你一个更好的签名吗? clrinterop.codeplex.com/releases/view/14120
-
我已经看到 stackoverflow.com/questions/2624373/… 但是有 PVOID,在我的示例中看起来像 PWSTR 中的问题
-
我刚刚尝试了 clrinterop.codeplex.com 并使用了他们的签名/同样的错误,看起来是 microsoft bug
-
有什么问题?它报告该值太长,无法放入您传入的缓冲区中。当您传递 0 的长度时,它表示它太小并将 lpcName 更改为所需的值。
-
您也可以尝试在您给出的描述中添加一些标点符号,这几乎没有意义,我猜测实际问题是什么。
标签: c# winapi registry unmanaged dllimport