C++ DLL

DLL(Dynamic Link Library)
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统 DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见
在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
(3)VC动态链接库的分类
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库:不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;
MFC规则DLL:包含一个继承自CWinApp的类,但其无消息循环
MFC扩展DLL:采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

/** testdll.h **/
#pragma once #ifndef __SERIALPORT_DLL__
#define __SERIALPORT_DLL__ #ifdef SERIALDLL
#define SERIALDLL extern "C" __declspec(dllimport)
#else
#define SERIALDLL extern "C" __declspec(dllexport)
#endif SERIALDLL int add(int x,int y); #endif //__SERIALPORT_DLL__ /** testdll.cpp **/
#include "SerialPort.h" int add(int x,int y)
{
return x + y;
} /** testdll.def **/
LIBRARY "libserial" EXPORTS
add @1

模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。
.def 文件必须至少包含下列模块定义语句:
1.文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。
2.EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。

提示:如果希望优化 DLL 文件的大小,请对每个导出函数使用 NONAME 属性。使用 NONAME 属性时,序号存储在 DLL 的导出表中而非函数名中。如果导出许多函数,这样做可以节省相当多的空间。
其实__declspec(dllexport)的作用就是让编译器按照某种预定的方式(前面大致解释了这种方式的规则)来输出导出函数及变量的符号,而def文件则是自己为每一个函数和变量指定导出符号,所以def是一个非自动化,手工很强的方式,不是特殊情况的话,实在没有必要浪费这些时间。参考链接:http://blog.csdn.net/g710710/article/details/7255744

http://blog.csdn.net/xupan_jsj/article/details/9028759

代码下载链接:https://git.oschina.net/klcf0220/serialport

C++ DLLC++ DLL
Code// CallSerialDll.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
#include <iostream>
using namespace std; //#pragma comment(lib,_T("dllserial.dll")) //静态调用动态库 typedef int(*lpAddFun)(int, int); //宏定义函数指针类型 int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
int x, y;
while(1)
{
std::cin >> x >> y;
hDll = LoadLibrary(_T("libserial.dll")); //动态调用动态库
//hDll = LoadLibrary(_T("libserial.dll"));
if (hDll != NULL)
{
//addFun = (lpAddFun)GetProcAddress(hDll, _T("add"));
addFun = (lpAddFun)GetProcAddress(hDll, MAKEINTRESOURCE(1)); //MAKEINTRESOURCE直接使用导出文件中的序号
if (addFun != NULL)
{
//int result = addFun(2, 3);
int result = addFun(x, y);
printf("%d\n", result);
}
else
{
printf("error %ld: GetProcAddress().\n",::GetLastError());
}
FreeLibrary(hDll);
}
else{
printf("error %ld: LoadLibrary().\n",::GetLastError());
}
}
return 0;
}

参考链接:http://blog.csdn.net/g710710/article/details/7255744

http://blog.csdn.net/xupan_jsj/article/details/9028759

代码下载链接:https://git.oschina.net/klcf0220/serialport

参考链接:http://msdn.microsoft.com/zh-cn/library/1ez7dh12.aspx

http://blog.csdn.net/g710710/article/details/7255744

http://blog.csdn.net/yysdsyl/article/details/2626033

http://blog.csdn.net/xupan_jsj/article/details/9028759

代码下载链接:https://git.oschina.net/klcf0220/serialport

上一篇:CCF CSP 201609-4 交通规划


下一篇:init.ora, pfile, spfile