VC++动态链接库编程之通信控制DLL

来源:互联网 发布:java内部类可以用呢 编辑:程序博客网 时间:2024/06/05 18:18

我们在这里举一个串口通信类的例子。

也许您需要了解一点串口通信的背景知识,其实串口到处都看得到,譬如PC机的COM口即为串行通讯口(简称串口)。如图20,打开Windows的设备管理器,我们看到了COM口。

在Windows系统,需通过DCB(Device Control Block)对串口进行配置。利用Windows API GetCommState函数可以获取串口当前配置;利用SetCommState函数则可以设置串口通讯的参数。

串行通信通常按以下四步进行:

(1)打开串口;

(2)配置串口;

(3)数据传送;

(4)关闭串口。

 

 

图20 PC的串口

由此可见,我们需要给串口控制DLL提供如下四个接口函数:

//打开指定的串口,其参数port为端口号

BOOL ComOpen(int port); //在这个函数里使用默认的参数设置串口

//将打开的串口关闭

void ComClose(int port);

//将串口接收缓冲区中的数据放到buffer中

int GetComData(char *buf, int buf_len);

//将指定长度的数据发送到串口

int SendDataToCom(LPBYTE buf,int buf_Len);

下面给出了DLL接口的主要源代码框架:

//com.h:com类通信接口

class AFX_EXT_CLASS com

{

public:

ComOpen(int port)

{

}

int SendDataToCom(LPBYTE buf,int buf_Len)

{

}

int GetComData(char *buf, int buf_len)

{

}

void ComClose()

{

}

}

我们编写一控制台程序来演示DLL的调用:

#include <iostream>

#include <exception>

using namespace std;

#include <windows.h>

#include "com.h" //包含DLL中导出类的头文件 int main(int argc, char *argv[])

{

try

{

char str[] = "com_class test";

com com1;

com1.ComOpen (1);

for(int i=0; i<100; i++) //以同步方式写com的buffer

{

Sleep(500);

com1.SendDataToCom (str,strlen(str));

}

com1.ComClose ();

}

catch(exception &e)

{

cout << e.what() << endl;

}

return 0;

}

DLL的编写与调用方法及主要应用皆已讲完,在下一节里,我们将看到比较“高深”的主题――DLL木马。曾几何时,DLL木马成为了病毒的一种十分重要的形式,是DLL的什么特性使得它能够成为一种病毒?下一节我们将揭晓谜底。