Microsoft CryptoAPIを使用してSHA-1を計算し、Windows 7、Windows Server 2008、Windows Server 2003で動作するコンパイル済みexeを取得しました。私はWindows XP SP3の下でそれを実行すると、動作しません。MS CryptoAPIがCryptAcquireContext()でWindows XPで動作しない
私はCryptAcquireContext()
コールの失敗を絞りました。
私はa previous postは「(プロトタイプ)... 」のXP不良の命名について話しました、それはWinXPの特定のマクロMS_ENH_RSA_AES_PROV_XPを使用して考慮しなければならないという通知をしました。
私はXP固有のコードの変更を行いましたが、それでも動作しません。 (bResult
戻りウィンXP上の0偽、真の1を返しbResult
他のすべてのプラットフォーム。)
は、私はすべてのものは、動作するようにセットアップされたように見えるので、私はregedit.exeをで見る実際のキー+文字列値でMS_ENH_RSA_AES_PROV_XPを確認したが失敗。
私はWindows XP上で動作させるために何か見落としましたか?
問題を説明するためにできるだけ短い例を貼り付けました。 VS2010 C++を使用しました。
// based on examples from http://msdn.microsoft.com/en-us/library/ms867086.aspx
#include "windows.h"
#include "wincrypt.h"
#include <iostream>
#include <iomanip> // for setw()
void main()
{
BOOL bResult;
HCRYPTPROV hProv;
// Attempt to acquire a handle to the default key container.
bResult = CryptAcquireContext(
&hProv, // Variable to hold returned handle.
NULL, // Use default key container.
MS_DEF_PROV, // Use default CSP.
PROV_RSA_FULL, // Type of provider to acquire.
0); // No special action.
std::cout << "line: " << std::setw(4) << __LINE__ << "; " << "bResult = " << bResult << std::endl;
if (! bResult) { // try Windows XP provider name
bResult = CryptAcquireContext(
&hProv, // Variable to hold returned handle.
NULL, // Use default key container.
MS_ENH_RSA_AES_PROV_XP, // Windows XP specific instead of using default CSP.
PROV_RSA_AES, // Type of provider to acquire.
0); // No special action.
std::cout << "line: " << std::setw(4) << __LINE__ << "; " << "bResult = " << bResult << std::endl;
}
if (bResult)
CryptReleaseContext(hProv, 0);
}
Windows 7の成功:
のWindows XPの失敗:あなたのCryptAcquireContextコードで
はい、うまくいきました!ありがとうございました。コードをコピーしたMicrosoftのオンラインサンプルは、そのパラメータを持っていませんでした。しかし、混乱に加えて、MS_ENH_RSA_AES_PROV_XPを使用しない最初の呼び出しにCRYPT_VERIFYCONTEXTを追加すると、XPでも動作します!不思議ですが、私はそれを取るでしょう。 – JasDev