1

CNG (Cryptography Next Generation) の下で単純なアルゴリズム プロバイダーを作成します。まさにユーザー モードのハッシュ プロバイダーです。
CNG 開発キットのヘルプの指示によると、「ハッシュ プロバイダーはGetHashInterface関数を実装し、名前でエクスポートする必要があります」。
アルゴリズム プロバイダーを実装するには、CNG 開発キットの "bcrypt.h" ファイルを含める必要があります。GetHashInterfaceこのファイルは、関数のインターフェイスも定義しますが、exportディレクティブはありません。正確には次のとおりです。

__checkReturn
NTSTATUS
WINAPI
GetHashInterface(
    __in    LPCWSTR pszProviderName,
    __in    LPCWSTR pszAlgId,
    __out   BCRYPT_HASH_FUNCTION_TABLE **ppFunctionTable,
    __in    ULONG   dwFlags);

たとえば、ヘッダー ファイル内の関数をエクスポート可能な関数として再定義するとします。

#ifndef __CngHashProvider
#define __CngHashProvider
///////////////////////////////////////////////////////////////
#ifndef EXPORT
#define EXPORT extern "C" __declspec(dllexport)
#endif

EXPORT NTSTATUS WINAPI GetHashInterface(
    __in   LPCWSTR pszProviderName,
    __in   LPCWSTR pszAlgId,
    __out  BCRYPT_HASH_FUNCTION_TABLE **ppFunctionTable,
    __in   ULONG dwFlags
);

////////////////////////////////////////////////////////////////
#endif __CngHashProvider

エラーメッセージが表示されるはずです:

エラー C2375 'GetHashInterface': 再定義。異なるリンケージ

EXPORT ディレクティブを削除すると (または関数のインターフェイス事前定義全体を削除すると)、エラー メッセージは表示されなくなりますが、DLL から関数をエクスポートできません。
ですから、必要な機能をエクスポートするために問題を解決する方法を教えてくださいGetHashInterface

4

2 に答える 2

1

現時点では、問題を解決する方法を「見つけました」。
ファイルbcrypt.hを CNG 開発キットからプロジェクト フォルダーにコピーし、GetHashInterface関数の定義を削除しました。私のプロジェクトには、元のヘッダー ファイルではなく、変更されたヘッダー ファイルを含める必要があります。
それが正しい方法かどうかはわかりませんが、私にとってはうまくいきます。

于 2016-04-09T06:39:26.990 に答える
0

bcrypt.h を編集しなくても .def ファイルを使用できます。Visual Studio の場合: [追加] -> [新しいアイテム] -> [コード] -> [モジュール定義ファイル]。

このファイルに追加するだけです:

LIBRARY "yourlibraryname"

EXPORTS

  GetHashInterface = GetHashInterface
于 2016-06-01T14:24:53.473 に答える