现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

VC++开发DLL学习笔记

2012-12-13 11:56 工业·编程 ⁄ 共 1320字 ⁄ 字号 暂无评论

1.在VS2005中建立Win32 Dynamic-Link Library的方法:
文件->新建->项目->Visual C++->Win32->Win32项目,进入Win32应用程序向导,
在应用程序设置的应用程序类型中选择“DLL(D)”,一般还要在附加选项中勾选“空项目”

2.在VS2005中添加DLL的方法:
1)隐式链接方式加载DLL
首先将dll项目中生成的.lib文件和.dll文件复制到调用项目中。其实项目在编译时只需要.lib文件,不需要.dll文件;而编译完成后,链接时就需要.dll文件了,.lib文件的任务就完成了,可以删去(开发过程中建议保留,毕竟还要调试),所以开始时两个文件可以一起拷过去。
然后有两种方法导入dll:一种是[解决方案资源管理器]“项目->属性->配置属性->链接器->输入->附加依赖项”里填写“dll1.lib”(必须是.lib文件,.dll文件会出错,原因当然就是因为链接时只要.lib文件),多个lib以空格隔开;另一种方法是添加代码#pragma comment(lib, "dll1.lib")。
2)显示加载方式加载DLL
首先将dll项目中生成的.dll文件(不需要.lib文件)复制到调用项目中,然后使用LoadLibrary函数,以下是一个例子:
void CdllTestDlg::OnBnClickedBtnAdd()
{
// TODO: 在此添加控件通知处理程序代码
/*CString str;
str.Format("5 + 3 = %d", add(5, 3));
MessageBox(str);*/
HINSTANCE hInst;
hInst = LoadLibrary("dll2.dll");
typedef int (*ADDPROC)(int a, int b);
ADDPROC Add = (ADDPROC)GetProcAddress(hInst, "add");
if(!Add)
{
MessageBox("获取函数地址失败");
return;
}
CString str;
str.Format("5 + 3 = %d", Add(3, 5));
MessageBox(str);
}
两种方法的比较:
1)隐式:实现简单,但是每一次程序运行时都要把dll文件加载到内存,时间和空间消耗大;而且要用到.lib和.dll两个文件。
2)显式:实现较为复杂,但是每个.dll文件只有在要用到其导出的函数或类时才加载到内存,节约了时间和空间,同时只要用到.dll文件,不需要.lib文件。

3.VS2005的Depends工具在VS的安装文件里面,具体是……\Microsoft Visual Studio 8\Common7\Tools\Bin\Depends.exe

4.vC++开发dll有三种调用约定:
1)默认式:会发生名字改写,只能用于同一编译器译的程序;但是可以导出类。
2)标准式:会发生名字改写,不能导出类;但可被其他编绎器编译的程序使用(如Delphi等pascal语言程序)。
3)extern "C"式:不能导出类,只能用于C编译器编译的程序;但是不会发生名字改写。
解决名字改写的文法,写一个单独的.def文件,具体见孙鑫老师的《VC++深入详解》P722

给我留言

留言无头像?