C ++访问冲突调用从DLL函数(C++ Access violation calling func

2019-09-21 07:07发布

我正在开发将使用标准的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旗舰版和Windows XP SP3。

谢谢!

(PS:我已经尝试加载功能“的C_Initialize”使用“GetProcAddress的”从库,和它的工作)

---编辑

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

Answer 1:

从这个形象,它看起来像你要么有你的布局某种分歧CK_FUNCTION_LIST_PTR的可执行文件和DLL之间的结构。 确保可执行文件和DLL都使用相同的编译器设置等编译

的定义是什么(包括任何周边编译指示/宏)的CK_FUNCTION_LIST_PTR ? 是sizeof(CK_FUNCTION_LIST_PTR)如果你要从你的可执行文件,并从DLL内打印出它的值相同(比如说, C_GetFunctionList()



文章来源: C++ Access violation calling function from dll