2013-03-25 59 views
1

我在寫一個最終將連接到虛擬標記的dll。我試圖製作一個可導出的C_getfunctionlist函數,它將包含指向PCKS#11標準支持的函數的指針地址,但我無法弄清楚爲什麼我無法在使用該DLL的程序中訪問這些函數。我試圖加載只是C_Initialize函數。PKCS#11在dll中的C_getfunctionlist

extern "C" __declspec(dllexport) 
CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList) { 
    CK_FUNCTION_LIST_PTR function_list; 
    function_list=new CK_FUNCTION_LIST; 
    function_list->C_Initialize=&C_Initialize; 
    ppFunctionList=&function_list; 
return CKR_OK; 

} 

回答

0

如果你想在你的代碼中使用一個PKCS#11實現的功能,您必須加載它實現了標準,然後使用由DLL提供的功能的DLL。這裏是我在Linux系統上使用的代碼。我希望它有幫助。


static char const * PKCS11_SO_NAME = "/usr/lib/pkcs11/PKCS11_API.so"; 

static void * pkcs11_so; 
//list of all pkcs#11 functions 
static CK_FUNCTION_LIST_PTR pkcs11; 

CK_RV load_pkcs11() { 
    CK_RV rv = CKR_OK; 
    CK_RV (*C_GetFunctionList) (CK_FUNCTION_LIST_PTR_PTR) = 0; 

    pkcs11_so = dlopen(PKCS11_SO_NAME, RTLD_NOW); 
    if (!pkcs11_so) { 
    fprintf(stderr, "Error loading pkcs#11 so: %s\n", dlerror()); 
    return CKR_GENERAL_ERROR; 
    } 

    rv = load_symbol((void **)&C_GetFunctionList, "C_GetFunctionList"); 
    if (CKR_OK != rv) { 
    return rv; 
    } 

    rv = C_GetFunctionList(&pkcs11); 
    if (CKR_OK != rv) { 
    fprintf(stderr, "C_GetFunctionList call failed: 0x%.8lX", rv); 
    return rv; 
    } 

    return CKR_OK; 
}