1

私はVS2013 ARM Developer Promptで作業しています。Microsoft の Cryptography Next Generation (CNG) を使用しようとしていますが、重大な問題が発生しています。

簡単なテストプログラムをコンパイルしようとしています:

#include <windows.h>
#include <bcrypt.h>

int main(int argc, char* argv[])
{
    BCRYPT_ALG_HANDLE hProvider = NULL;
    NTSTATUS ret = BCryptOpenAlgorithmProvider(&hProvider, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -1;
    }

    unsigned char buffer[20];
    ret = BCryptGenRandom(hProvider, buffer, (ULONG)sizeof(buffer), 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -2;
    }

    ret = BCryptCloseAlgorithmProvider(hProvider, 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -3;
    }

    return 0;
}

私はそれをコンパイルしようとします:

C:\Users\Test>cl.exe /nologo /W4 /D_MBCS /Zi /TP /EHs c /MD /FI sdkddkver.h /FI winapifamily.h /DWINAPI_FAMILY=WINAPI_FAMILY_APP /c test.cxx
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for ARM
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cxx
test.cxx(6) : error C2065: 'BCRYPT_ALG_HANDLE' : undeclared identifier
test.cxx(6) : error C2146: syntax error : missing ';' before identifier 'hProvid
er'
test.cxx(6) : error C2065: 'hProvider' : undeclared identifier
test.cxx(7) : error C2065: 'NTSTATUS' : undeclared identifier
test.cxx(7) : error C2146: syntax error : missing ';' before identifier 'ret'
test.cxx(7) : error C2065: 'ret' : undeclared identifier
test.cxx(7) : error C2065: 'hProvider' : undeclared identifier
test.cxx(7) : error C2065: 'BCRYPT_RNG_ALGORITHM' : undeclared identifier
test.cxx(7) : error C2065: 'MS_PRIMITIVE_PROVIDER' : undeclared identifier
test.cxx(7) : error C3861: 'BCryptOpenAlgorithmProvider': identifier not found
test.cxx(8) : error C2065: 'ret' : undeclared identifier
test.cxx(8) : error C3861: 'BCRYPT_SUCCESS': identifier not found
test.cxx(14) : error C2065: 'ret' : undeclared identifier
test.cxx(14) : error C2065: 'hProvider' : undeclared identifier
test.cxx(14) : error C3861: 'BCryptGenRandom': identifier not found
test.cxx(15) : error C2065: 'ret' : undeclared identifier
test.cxx(15) : error C3861: 'BCRYPT_SUCCESS': identifier not found
test.cxx(20) : error C2065: 'ret' : undeclared identifier
test.cxx(20) : error C2065: 'hProvider' : undeclared identifier
test.cxx(20) : error C3861: 'BCryptCloseAlgorithmProvider': identifier not found

test.cxx(21) : error C2065: 'ret' : undeclared identifier
test.cxx(21) : error C3861: 'BCRYPT_SUCCESS': identifier not found

含めようとすると<ntstatus.h>(Microsoftから有用なものが見つからないように見えるため、 PJ Naughterのブログから削除されました):

cl.exe /nologo /W4 /D_MBCS /Zi /TP /EHsc /MD /FI sdkddkver.h /FI winapifamily.h /DWINAPI_FAMILY=WINAPI_FAMILY_APP /c osrng.cpp
osrng.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(66) : warning
C4005: 'STATUS_WAIT_0' : macro redefinition
        C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(2202) : see p
revious definition of 'STATUS_WAIT_0'
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(212) : warning
 C4005: 'STATUS_ABANDONED_WAIT_0' : macro redefinition
        C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(2203) : see p
revious definition of 'STATUS_ABANDONED_WAIT_0'
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(235) : warning
 C4005: 'STATUS_USER_APC' : macro redefinition
...

LONGMicrosoft マクロはコードBCRYPT_SUCCESSにキャストするのが好きなので、それを にすることはできません。NTSTATUS

NTSTATUSVS2012 ARM Developer Prompt で欠落している問題を再現することもできます。

NTSTATUSARM での宣言を取得するには、どのヘッダー ファイルを含める必要がありますか?


これは関連している可能性があると思いますが、確かではありません:致命的なエラー LNK1104: Surface RT タブレット用にビルドするときにファイル 'bcrypt.lib' を開くことができません。私が知っているのは、これを使用しようとすると非常に多くの問題があるため、Microsoft によって十分にテストされていないように見えるということだけです。

4

1 に答える 1

4

主な問題は、BCRYPT はユニバーサル Windows プラットフォーム アプリ (別名 Windows 10 ストア アプリ) ではサポートされていますが、Windows 8.x ストア アプリではサポートされていないことです。VS 2013 ツールセットは常に Windows 8.1 SDK を使用するため、Windows 8.1 ストア アプリを構築していました。VS 2012 を試したときは、Windows 8.0 SDK を使用していたので、Windows 8.0 ストア アプリを構築していました。繰り返しますが、どちらも BCRYPT をサポートしていません。VS 2015 でビルドし、Windows 10 SDK がインストールされている場合、コードは正常にビルドされます。

/D_MBCSWindows ストア アプリのオプションではないことに注意してください。すべての Windows ストア アプリは/DUNICODE /D_UNICODE、ANSI/Multibyte ではなく、Unicode 用に構築する必要があります。

また、リンクするwindowsapp.libときに正しい DLL を選択するように、必ず とリンクしてください。

#include <bcrypt.h>ファイルにまったくない場合、表示されているすべてのエラーが VS 2012/2013 で発生していることを簡単に確認できます。サポートされていないすべてのDWINAPI_FAMILY=WINAPI_FAMILY_APPAPI が未定義であることを保証するため、Windows 8.x Store では、そのヘッダーは基本的に空のファイルでした。

于 2016-05-01T06:12:17.547 に答える