描述:
那位大哥帮忙?
解决方案1:
DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。DLL模块中包含各种导出函数,用于向外界提供服务
第一道:
1.创建:
(1).生成DLL项目
.h定义需要导出的变量,函数和类的原型以及导出标识符
.CPP文件定义要导出的变量,函数和类的定义以及DllMain函数(分析DllMain函数中的通知)
加入导出函数的原型和定义:
__declspec(dllexport) int MyFunction(int n);
(2).生成DLL
测试生成的DLL(包括变量,函数和类)
使用Dumpbin查看生成DLL的输出符号
利用extern “C”来防止输出的函数被改名
2. 两种使用动态连接库的技术:
显式链接技术和隐式链接技术
隐式链接是指在应用程序中不需指明DLL文件的实际存储路径。在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件,LIB文件作为DLL的替代文件被编译到应用程序项目中。
显式链接就不必再使用导入文件,而是直接调用LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。假设有一个导出如下函数的DLL文件:
extern "C" __declspec(dllexport) double SquareRoot(double d);
下面是应用程序对该导出函数的显式链接的例子:
typedef double(SQRTPROC)(double);
HINSTANCE hInstance;
SQRTPROC* pFunction;
VERIFY(hInstance=::LoadLibrary("c:\\winnt\\system32\\mydll.dll"));
VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,"SquareRoot"));
double d=(*pFunction)(81.0);
采用显式链接方式,程序员可以决定DLL文件何时加载或不加载。
第二道:直接输出类的封装性不好,private只支持语法上的封装性,不支持二进制的封装性利用抽象基类作为接口类可以加强封装性,但是需要提供创建类和删除类的函数
利用引用计数技术有效管理对象的生命期。