簡體   English   中英

DllImport ERROR_MORE_DATA UNMANAGED在C#PBYTE中調用C ++

[英]DllImport ERROR_MORE_DATA UNMANAGED Call C++ in C# PBYTE

DWORD OREnumValue(
  __in         ORHKEY Handle,
  __in         DWORD dwIndex,
  __out        PWSTR lpValueName,
  __inout      PDWORD lpcValueName,
  __out_opt    PDWORD lpType,
  __out_opt    PBYTE lpData,
  __inout_opt  PDWORD lpcbData
);

我的代碼:

public static extern uint OREnumValue(IntPtr Handle, uint dwIndex, [MarshalAsAttribute(UnmanagedType.LPWStr)] out StringBuilder lpValueName, ref int lpcValueName, out uint lpType, out IntPtr lpData, ref int lpcbData);

    IntPtr Handle=mykey;
    uint dwIndex=0;

    StringBuilder lpValueName = new StringBuilder(16383);
    int lpcValueName=lpValueName.Capacity;  

    uint lpType=0;
    IntPtr lpData;
    int lpcbData = int.MaxValue;

    uint ret3= OREnumValue(Handle, dwIndex, out lpValueName, ref lpcValueName, out lpType, out lpData, ref lpcbData);

這給出了一個錯誤:

ret3=ERROR_MORE_DATA 259

我認為問題出在

  1. lpData-我應該對PBYTE使用什么? 要么
  2. lpcbData-我應該使用什么容量?

從MSDN

如果lpData指定的緩沖區不足以容納數據,則該函數返回ERROR_MORE_DATA並將所需的緩沖區大小存儲在lpcbData指向的變量中。 在這種情況下,lpData的內容是不確定的。

您永遠不要顯式定義字符串生成器的長度,應使用RegQueryInfoKey方法獲得此值,該方法將為您提供最長值名稱,子項名稱和值數據的長度(以字節為單位),您可以將其用於初始化字符串生成器和字節數組,它們接收實際的名稱和數據。 這意味着您使用的內存量可能最少,同時仍然足夠大以容納結果。 我很確定您的問題出在為lpValueName定義的長度中。

同樣,您應該使用UIntPtr而不是IntPtr,並且如果需要數據,則lpData字段應為字節數組。

根據以下來源,您應該對PBYTE使用IntPtr:

(這些不是顯式用於您的api,而是也在使用PBYTE。如果將msdn中的c ++值與列出的鏈接進行比較)

您很可能需要定義

    var myIntPtr = Marshal.AllocCoTaskMem(sizeOfMyIntPtr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM