我应该如何在vc中引用下面DLL中的函数!

fanbo 2009-07-20 05:02:53
如题!
下面几个函数说明是dll中函数的说明,应该用c或者c++做的。
我现在想在vc中使用这些函数。

1) 打开串口
int IniCom(int ComPort,int BaudRate)
入口参数:
ComPort: 串口
BaudRate: 通讯波特率,推荐取值为19200
返回值:
0:成功
-7:串口打开错

2) 关闭串口
int CloseCom(int ComPort)
返回值:
0:成功
-7:串口关闭错

3) 读取个人基本信息
int ReadPersonalInfo(int ComPort,unsigned char *Name,unsigned char *buffer)
入口参数: 无
出口参数:
Name:8字节姓名(ASCII码)
buffer:
职务代码:4字节
证件号码:20字节
部门代码:10字节
身份代码:4字节
性别:1字节(0:男;1:女)
返回值:
0:成功
-6:终端设备在1500ms内无应答
1: 无卡
16:黑名单卡


4) 读取卡基本信息
int ReadCardInfo(int ComPort, unsigned char *CardNum,unsigned char *CardNum1,unsigned char *CardID,int &CardType,unsigned char *ExpireDay)
入口参数:
出口参数:
CardNum:卡显示卡号(10字节,ASCII码)
CardNum1:交易卡号(7字节,ASCII码)
CardID:卡序列号(4字节,HEX)
cardType:卡类
ExpireDay:卡有效期(3字节,Hex年月日)
返回值:
0:成功
-6:终端设备在1500ms内无应答
1: 无卡
3:钱包数据错
16:黑卡

//////////////////////////////////////////////////////
我在程序里面能正确使用前面两个程序,但是对于后面两个函数就不知道该怎么使用了。
希望高手能给出例子。

...全文
172 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanbo 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 oyljerry 的回复:]
串口设备是否没有正确打开...
[/Quote]

调试的时候是正确的,显示是返回值为 0 。
fanbo 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ccpaishi 的回复:]
头文件和lib库包含了吗??
[/Quote]
老大什么意思?
fanbo 2009-08-05
  • 打赏
  • 举报
回复
在他们给的文档中,
BaudRate: 通讯波特率,推荐取值为:0 即19200
取 值 代表含义
0 19200
1 9600
2 600
3 1200
4 2400
5 4800
6 14400
7 57600

[Quote=引用 5 楼 zhouzhipen 的回复:]
你打开时所使用的通讯波特率不能是1,请使用与设备一样的波特率.
[/Quote]
oyljerry 2009-07-20
  • 打赏
  • 举报
回复
串口设备是否没有正确打开...
  • 打赏
  • 举报
回复
-6:终端设备在1500ms内无应答
zhoujianhei 2009-07-20
  • 打赏
  • 举报
回复
Proc = (Init)GetProcAddress(hinstDLL,"IniCom");
int iValue = Proc(1,19200); // 端口号为1,波特率为19200
ccpaishi 2009-07-20
  • 打赏
  • 举报
回复
头文件和lib库包含了吗??
zhouzhipen 2009-07-20
  • 打赏
  • 举报
回复
你打开时所使用的通讯波特率不能是1,请使用与设备一样的波特率.
zhouzhipen 2009-07-20
  • 打赏
  • 举报
回复
3) 读取个人基本信息
int ReadPersonalInfo(int ComPort,unsigned char *Name,unsigned char *buffer)
可以使用一个结构体来简化操作

typedef struct
{
int nCode;//职务代码
char szNum[20];// 证件号码
char szNnm1[10];//部门代码
int nCode1;//身份代码
}PersonalInfo;

//调用:

PersonalInfo info;
char szname[]="张三";
int r=ReadPersonalInfo(1,szname,(unsigned char *)(&info));
//现在info中的成员变量就是对应的值了.在下面加入自己的操作
//....


第4个也可以用相似的办法调用(更简单)
int ReadCardInfo(int ComPort, unsigned char *CardNum,unsigned char *CardNum1,unsigned char *CardID,int &CardType,unsigned char *ExpireDay)


unsigned char CardNum[11];
unsigned char CardNum1[8];
int CardID=0;
int cardType=0;
int ExpireDay=0;

memset(CardNum,0,11);
memset(CardNum1,0,8);
int r=ReadCardInfo(1,CardNum,CardNum1,(unsigned char *)(&CardID),cardType,(unsigned char *)(&ExpireDay));
//好了现在已经完成函数的调用了...


fanbo 2009-07-20
  • 打赏
  • 举报
回复
我在窗体上添加了一个按钮,在按钮的事件中代码如下:
void CTestDlg::OnBtest()
{

UpdateData(true);

typedef int(_stdcall *Init)(int ComPort,int BaudRate);
typedef int(_stdcall *Cls)(int ComPort);
typedef int(_stdcall *RPI)(int ComPort,unsigned char *Name,unsigned char *buffer);
HINSTANCE hinstDLL=NULL;
hinstDLL=LoadLibrary("SmartCom411SFJ.dll");
if (hinstDLL)
{

//打开串口
Init Proc = NULL;
Proc = (Init)GetProcAddress(hinstDLL,"IniCom");
int iValue = Proc(1,1);
char p[10] = {0};
sprintf(p,"%d",iValue);
AfxMessageBox("open com1");
AfxMessageBox(p);


//读取个人信息
RPI Proc3 = NULL;
Proc3 = (RPI)GetProcAddress(hinstDLL,"ReadPersonalInfo");
unsigned char szName[8 + 1] = {0}, szBuf[39 + 1] = {0};
iValue = Proc3(1,szName,szBuf); //参数类型一定要注意
sprintf(p,"%d",iValue);
AfxMessageBox("read personal information");
AfxMessageBox(p);


//关闭串口
Cls Proc2 = NULL;
Proc2 = (Cls)GetProcAddress(hinstDLL,"CloseCom");
iValue = Proc2(1);
sprintf(p,"%d",iValue);
AfxMessageBox("关闭端口");
AfxMessageBox(p);

FreeLibrary(hinstDLL);
}
else
{
AfxMessageBox("没找到dll");
}
}

在上述代码的执行过程中,打开和关闭com都能正常的返回1.
可是在ReadPersonalInfo(读取个人信息的函数中)始终返回是-6.
是否是我的参数对照问题,还是其他问题。
icefairy 2009-07-20
  • 打赏
  • 举报
回复
不知道LZ遇到了什么问题..~~~
zhouzhipen 2009-07-20
  • 打赏
  • 举报
回复
为什么不能用,是调用出错还是,其它的情况,请把问题描述得具体一点,或是把调用函数的代码帖出来.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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