来自dll的C ++访问冲突调用函数

时间:2012-08-16 18:39:01

标签: c++ visual-c++ 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 functions”似乎有效。

有谁知道造成这种异常的原因是什么?

我正在使用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"

};

完整标题:   http://www.rsa.com/rsalabs/node.asp?id=2133

1 个答案:

答案 0 :(得分:0)

从该图像看,您可能对可执行文件和DLL之间的CK_FUNCTION_LIST_PTR结构的布局存在某种不同意见。确保可执行文件和DLL都使用相同的编译器设置进行编译等。

CK_FUNCTION_LIST_PTR的定义(包括任何周围的pragma /宏)是什么?如果您从可执行文件和DLL内部(例如,sizeof(CK_FUNCTION_LIST_PTR))打印出来的值,C_GetFunctionList()是否相同?