我想在C#中使用'CryptAcquireContext'WinAPI函数。
我有using System.Runtime.InteropServices
,我按以下方式导入DLL:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CryptAcquireContext(ref IntPtr hProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags);
要调用该函数,我使用以下代码:
IntPtr handelTest = new IntPtr();
uint CRYPt_VERIFYCONTEXT = 0xF0000000;
uint PROV_RsA_FULL = 1;
bool res = CryptAcquireContext(ref handelTest, null, "MS_ENHANCED_PROV", PROV_RsA_FULL, CRYPt_VERIFYCONTEXT);
if (!res)
{
int a = Marshal.GetLastWin32Error();
Console.WriteLine("Error in Acqired, CryptAcquireContext function\n");
return;
}
Console.WriteLine("Key Context Acquired\n");
但是,发生错误并res==false
。
我的代码出了什么问题?
答案 0 :(得分:1)
这不是P / Invoke问题。参数很糟糕,GetLastError(a)是NTE_KEYSET_NOT_DEF / 0x80090019,这是“请求的提供者不存在。”。
传递null
作为提供者名称参数,或使用有效的提供者名称。
但是,请注意我会改为定义这样的函数(确保unicode,第一个参数是out
,而不是ref
):
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool CryptAcquireContext(out IntPtr hProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags);