
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
| ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 |
并将其中所有的中文翻译为英文。这个DLL为我们提供了如图19所示的对话框资源。
![]() 图19英文对话框 |
修改应用工程的InitInstance()函数,在
| CResourceDllCallDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); |
之前(即对话框显示之前)添加如下代码:
| //获取操作系统的语言 WORD wLangPID = PRIMARYLANGID( GetSystemDefaultLangID() ); if( LANG_CHINESE == wLangPID ) { hLanguageDll = LoadLibrary( "ChineseDll.dll" ); //加载中文资源 } else { hLanguageDll = LoadLibrary( "EnglishDll.dll" ); //加载英文资源 } if( NULL == hLanguageDll ) { AfxMessageBox( "Load DLL failure" ); return FALSE; } AfxSetResourceHandle( hLanguageDll ); //设置当前的资源句柄 |
这样的应用程序将具有自适应性质,在中文OS中显示中文资源,在英文OS中则显示英文资源。
7.3通信控制DLL
我们在这里举一个串口通信类的例子。
也许您需要了解一点串口通信的背景知识,其实串口到处都看得到,譬如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的什么特性使得它能够成为一种病毒?下一节我们将揭晓谜底。