我試圖包裹找到Secur32.dll的這是下面聲明EnumerateSecurityPackages功能:C#的P/Invoke找到Secur32.dll問題
SECURITY_STATUS SEC_Entry EnumerateSecurityPackages(
__in PULONG pcPackages,
__in PSecPkgInfo *ppPackageInfo
);
我有下面的C#代碼,但我得到一個AccessViolationException當我嘗試運行它。在調試器中,pcPackages變量的設置是否正確,但我認爲我在SecPkgInfos數組中做了錯誤。
[StructLayout(LayoutKind.Sequential)]
public struct SecPkgInfo
{
public ulong fCapabilities;
public ushort wVersion;
public ushort wRPCID;
public ulong cbMaxToken;
public string Name;
public string Comment;
}
[DllImport("Secur32.dll")]
public extern static int EnumerateSecurityPackages(
ref ulong pcPackages,
ref SecPkgInfo[] ppPackageInfo
);
///Calling code
ulong count = 0;
SecPkgInfo[] buffer = new SecPkgInfo[256];
EnumerateSecurityPackages(ref count, ref buffer);
任何想法我做錯了什麼?
我切換ULONG爲int,這似乎仍然工作正常。我還在名稱和註釋中添加了以下內容:[MarshalAs(UnmanagedType.LPStr)],我仍然得到一個AccessViolationException「嘗試讀取或寫入受保護的內存,這通常表示其他內存已損壞。」 – chotchki 2011-05-09 17:45:29
您需要檢查EnumerateSecurityPackages的語義 - 是否期望Name和Comment已指向現有緩衝區?誰將分配內存?此外,你想要編組爲LPWStr。 – 2011-05-09 18:37:10
ULONG = uint32不是uint64。 – Joshua 2011-05-09 20:05:46