【原】基于vc 6.0开发dll动态链接库和测试实例--串口操作
公司突然下达指令,让我这个从没用过vc的人开发一个接口函数,对接方又比较蛋疼,指定要求将接口封装到dll中进行使用,以下是使用过程中步骤说明以及一点自己的心得
(感谢网上所有开源,讲解的兄弟姐妹以及各位大牛老师们,分享快乐!)
1 制作简单的dll库
1)使用vc 6.0创建一个dll实例
选择win32 dynamiclink library选项创建一个dll实例、
选择a simple dll project模版
点击finish
点击ok会进入工程
2 代码修改
1)在123.cpp中会出现这样一段代码,对此无需修改
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
2)在StdAfx.cpp中,在include下方添加你需要使用的函数名称,格式如下
extern "C" __declspec(dllexport) int functionName (int value1, char * value2,char *value3);
3)然后添加你需要实现的函数体
int poka_command (int port, char * command,char *read_buf)
{
//这里我需要他实现一个对串口进行读写的功能
HANDLE m_hCom;
//hCom = OpenConnection(comPort);
// 串行口句柄
int m_nBaud;//数据传输速率
int m_nDataBits;//数据位
BOOL m_bEcho;//表明本地回显
BOOL m_bNewLine;//表明自动换行
int m_nParity;//校验位
int m_nStopBits;//停止位
COMMTIMEOUTS TimeOuts;
DCB dcb;
m_nBaud = 115200;
m_nDataBits = 8;
m_bEcho = FALSE;
m_bNewLine = FALSE;
m_nParity = 0;
m_nStopBits = 0;
char s[5]="";
sprintf(s,"COM%d",port);
m_hCom=CreateFile(s, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,
NULL); // 重叠方式
if(m_hCom==INVALID_HANDLE_VALUE)
return 0;
SetupComm(m_hCom,4096,4096);
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
/* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(!GetCommState(m_hCom, &dcb))
return 0;
dcb.fBinary=TRUE;
dcb.BaudRate = m_nBaud; // 数据传输速率
dcb.StopBits = ON
dcb.ByteSize = m_nDataBits; // 每字节位数
dcb.Parity = NOPARITY; //无奇偶校验
if(!SetCommState(m_hCom, &dcb))
{
return 0;
}
SetCommMask(m_hCom, EV_RXCHAR);
unsigned long l1;
char *m_send = "1234";
WriteFile(m_hCom, m_send,4, &l1, NULL);//发送数据
char str[17] = {'\0'};
unsigned long l0;
// char read_buf[17] = {'\0'};
int strL=0;//获取字符串长度
while(1)
{
ReadFile(m_hCom,str,16,&l0, NULL);
if(l0 > 0) //收到数据
{
printf("l0.length = %d",l0);
//判断有效数据长度
for(int i=0;i<(int)l0;i++)//将str中有效数据长度放到str2中
{
read_buf[strL++]=str[i];
}
printf("ReadFile==%s\n",str);//输出str2
printf("ReadFile==%s\n",read_buf);
if(strL>15)//判断str2长度是否为16位,是则跳出,否则继续读数据
break;
}
else{
memset(str,0,sizeof(str));
}
}
return 1;
}
4 然后点击编译,在debug文件夹下面就有生成好的dll文件了
调试:
1)将生成的dll文件拷贝到新建工程的根目录
2)在新建工程的StaAfx.cpp文件中加入
#include "windows.h"
typedef int (*poka_command) (int,char *,char *);
这是加入函数声明以及windows的头文件。
3)接下来就是对dll文件的引用,这里选择显式引用
HINSTANCE hDll;
poka_command myId;
hDll = LoadLibrary("object.dll");
if (hDll != NULL)
{
printf("hdll ok\n");
myId = (poka_command)GetProcAddress(hDll,"poka_command");
if(myId!=NULL)
{
printf("myid ok\n");
char command[20] = {"fdafda"};
char read_Buf[20]={'\0'};
int result = myId(3,command,read_Buf);
printf("\nresult = %d\n",result);
printf("id = %s ", read_Buf);
}
FreeLibrary(hDll);
}
点击运行可以查看结果。。这里我因为有串口外设,所以能看到结果。如果你没有,可以下一个虚拟串口工具, 新建两个关联串口进行调试。
这是我开发的步骤,已经验证可以通过,如果有问题,请留言指正,谢谢