[英]C++ Access violation calling function from dll
我正在開發一個使用標准PKCS#11訪問智能卡的應用程序。 此時應用程序在Ubuntu和OS X上都運行良好。現在我將它移植到Windows,但每當我調用pkcs#11庫中的函數時,我都會遇到“訪問沖突”異常,該庫在運行時鏈接。
下面我嘗試重現我的代碼的SSCCE(發生異常的地方用注釋標識)。
void * libraryHandle = NULL;
CK_RV rv;
CK_C_GetFunctionList pC_GetFunctionList;
CK_FUNCTION_LIST_PTR functions;
libraryHandle = LoadLibrary(L"C:\\WINDOWS\\system32\\pteidpkcs11.dll");
if (libraryHandle == NULL)
{
printf("Library not loaded\n");
exit(1);
}
pC_GetFunctionList = (CK_C_GetFunctionList) GetProcAddress((HMODULE)libraryHandle, "C_GetFunctionList");
if (pC_GetFunctionList == NULL)
{
printf("Function not loaded\n");
FreeLibrary((HMODULE)libraryHandle);
exit(1);
}
rv = (*pC_GetFunctionList) (&functions);
assert(rv == CKR_OK);
printf("Point A\n");
if(functions == NULL)
{
printf("Functions not loaded\n");
FreeLibrary((HMODULE)libraryHandle);
exit(1);
}
printf("%u - %u\n",functions->version.major, functions->version.minor); // Prints without problems
rv = (*functions->C_Initialize) (NULL_PTR); //THIS IS THE PLACE WHERE I AM GETTING THE ACCESS VIOLATION
assert(rv == CKR_OK);
//printf("Point B\n");
FreeLibrary((HMODULE)libraryHandle);
當我調試應用程序時,結構“CK_FUNCTION_LIST_PTR函數”似乎是有效的。
有誰知道造成這種異常的原因是什么?
我使用的是Visual Studio 2010 Ultimate和Windows XP SP3。
謝謝!
(PS:我已經嘗試使用庫中的“GetProcAddress”加載函數“C_Initialize”,並且它有效)
---編輯
CK_FUNCTION_LIST定義
struct CK_FUNCTION_LIST {
CK_VERSION version; /* Cryptoki version */
/* Pile all the function pointers into the CK_FUNCTION_LIST. */
/* pkcs11f.h has all the information about the Cryptoki
* function prototypes. */
#include "pkcs11f.h"
};
從該圖像看,您可能對可執行文件和DLL之間的CK_FUNCTION_LIST_PTR
結構的布局有某種不同意見。 確保可執行文件和DLL都使用相同的編譯器設置進行編譯等。
CK_FUNCTION_LIST_PTR
的定義是什么(包括任何周圍的編譯指示/宏)? 如果從可執行文件和DLL內部(例如,在C_GetFunctionList()
)打印出它的值, sizeof(CK_FUNCTION_LIST_PTR)
是否相同?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.