从C#调用CryptAcquireContext

时间:2017-06-03 10:10:01

标签: c# winapi pinvoke

我想在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。 我的代码出了什么问题?

1 个答案:

答案 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);