0
   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 2ndにある可能性がありますC#からPWSTRパラメーターを呼び出すにはどうすればよいですか? [MarshalAs(UnmanagedType.LPWStr)]out StringBuilder lpNameそれが正しいか?

4

1 に答える 1

1

これはかなり標準的な Windows エラー コードです。これは、winapi 関数を呼び出して、十分な大きさのバッファを渡さなかったことを意味します。この問題を解決する唯一の方法は、より大きなバッファーを渡すことです。

これは RegQueryKeyEx() のラッパーによく似ているため、関数に不正なデータを渡している可能性が非常に高くなります。lpcName引数は実際には であり、ref intIntPtr ではありません。そして、渡したバッファのサイズを格納する変数を渡すことになっています。あなたの場合は 255 です。lpcClass 引数も同様に中断されます。これで修正されるはずです:

[DllImport("offreg.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern uint OREnumKey(
    IntPtr Handle, 
    int dwIndex,
    StringBuilder lpName, 
    ref int lpcName, 
    StringBuilder lpClass, 
    ref int lpcClass, 
    out System.Runtime.InteropServices.ComTypes.FILETIME lpftLastWriteTime);

    ...   
    StringBuilder lpName=new StringBuilder("",255);
    int nameSize = lpName.Capacity;
    StringBuilder  lpClass=new StringBuilder("",255);
    int classSize = lpClass.Capacity;
    System.Runtime.InteropServices.ComTypes.FILETIME lpftLastWriteTime;
    uint ret3 = OREnumKey(hiveid, 0, lpName, ref nameSize, lpClass, ref classSize, out lpftLastWriteTime);
    if (ret3 != 0) throw new Exception("kaboom");
    string name = lpName.ToString();
    string className = lpClass.ToString();
于 2012-05-30T14:15:34.043 に答える