dll调用问题,在线等

geminilz 2004-09-24 07:30:17
现在在研究IKEY的PKI开发

它提供了c库和一个DLL,但是我要用VB做,只能调用DLL中的函数,
比如 它提供的c例子是这样写的
rv = C_Initialize(NULL_PTR);
rv是一个长整型(unsigned long int )的返回值,
参数是空指针吧,它是这样定义的:#define NULL_PTR 0

我用工具看了一下,dll中确实有这个函数 C_Initialize

我在vb中
Public Declare Function C_Initialize Lib "C:\WINNT\system32\K1PK112.DLL" (ByRef lngArg As Long) As Long

然后
Dim rv As Long
Dim lngtemp As Long
rv = C_Initialize(lngtemp)

编译的时候报错: DLL调用约定错误

这里到底该怎么改呢?请教大家
...全文
120 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
geminilz 2004-09-25
  • 打赏
  • 举报
回复
原型不太好看,还是第一次看到这种VC的宏定义,

1.函数调用的地方:
CK_RV rv;
rv = C_Initialize(NULL_PTR);

2.定义的地方:
CK_PKCS11_FUNCTION_INFO(C_Initialize)
#ifdef CK_NEED_ARG_LIST
(
CK_VOID_PTR pInitArgs /* if this is not NULL_PTR, it gets
* cast to CK_C_INITIALIZE_ARGS_PTR
* and dereferenced */
);
#endif
3.这应该是宏CK_PKCS11_FUNCTION_INFO定义吧:
#define CK_NEED_ARG_LIST 1
#define CK_PKCS11_FUNCTION_INFO(name) \
extern CK_DECLARE_FUNCTION(CK_RV, name)

4.CK_RV 定义:typedef unsigned long int CK_RV;
5.CK_VOID_PTR 定义:
#define CK_PTR *
typedef void CK_PTR CK_VOID_PTR;

就是这样了,感觉就是空指针
supergreenbean 2004-09-25
  • 打赏
  • 举报
回复
C_Initialize函数的C原型是什么?
dongle2001 2004-09-25
  • 打赏
  • 举报
回复
能不能写一下C_Initialize的函数体从错误提示看,应该是参数的问题.
geminilz 2004-09-25
  • 打赏
  • 举报
回复
我也觉得它可能不是__stdcall,没找到说明。谢谢绿豆了
supergreenbean 2004-09-25
  • 打赏
  • 举报
回复
你的函数估计不是__stdcall调用约定的,试试这个
http://community.csdn.net/Expert/TopicView.asp?id=3174414

另外,你函数声明为
Public Declare Function C_Initialize Lib "C:\WINNT\system32\K1PK112.DLL" (ByVal lngArg As Long) As Long
geminilz 2004-09-25
  • 打赏
  • 举报
回复
不好意思,这个漏掉了
#define CK_DECLARE_FUNCTION(returnType, name) \
returnType name

我觉得这些宏展开了就是 unsigned long int C_Initialize(void * )
绿豆大哥再帮忙看看吧
supergreenbean 2004-09-25
  • 打赏
  • 举报
回复
CK_DECLARE_FUNCTION宏又是怎么写的呢?
geminilz 2004-09-24
  • 打赏
  • 举报
回复
怎么就没人知道吗

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧