我的C++ CLR項目包含託管代碼和非託管代碼。在這個項目中,我循環通過一系列暗示供體並尋找合適的。CryptAcquireContextA在C++ CLR for「Aloaha加密提供程序」中失敗
所以我使用的功能
CryptEnumProvidersA
CryptAcquireContextA
我有一個使用C++項目C#項目。 當我調用該方法循環兩次加密加速器的列表時,我的應用程序崩潰。它在CryptAcquireContextA上崩潰。僅限於「Aloaha密碼提供商」。
當我使用調試模式時,它也崩潰。 但是,當我使用調試模式,設置斷點並通過代碼與F10,它工作正常。
當我執行C++代碼來分離項目時,它在任何情況下都可以正常工作。
所以,我在這裏有兩個問題:
1)如何這樣的崩潰可能?爲什麼會發生?
2)我怎樣才能調用CryptAcquireContextA來處理這樣的崩潰?
我的考慮。
1)記憶有些麻煩。我正在尋找內存泄漏,但我沒有找到任何內存泄漏。
2)我試圖使用try-catch,但沒有結果,CryptAcquireContextA無論如何都崩潰了。我想使用像「CryptIsValidProvider」或「CryptPingProvider」的功能,但我沒有找到它。
我找到了提供程序後的'睡眠',代碼工作正常。看起來它確實是競爭狀態。現在,是否有更優雅的決定來處理這個問題? 'CryptAcquireContextA'後使用'CryptReleaseContext'。但似乎'CryptReleaseContext'沒有立即釋放句柄或其他東西,所以'CryptAcquireContextA'在下次調用時失敗。 – Stanislav 2011-12-30 05:51:30
您可以向該CSP的開發者投訴,但即使他們注意了,除非您可以確保所有用戶都擁有最新的補丁版本,否則您很可能不得不通過「睡眠」調用。請務必留下詳細的評論,說明爲什麼「睡眠」電話在那裏,所以有人在維護過程中最終不會將其移除。 – 2011-12-30 07:05:42
我發現在「Aloaha Cryptographic Provider」的情況下,CryptAcquireContextA'向cryptoprovider返回NULL句柄。所以我的決定是如果句柄爲NULL,則調用'Sleep'。謝謝。 – Stanislav 2011-12-30 09:24:14