DLL初步(1)

这个主要是看过一个视频后的笔记

隐式链接

建立一个动态链接库工程,首先启动VC6.0,选择Win32 Dynamic-Link Library,然后输入工程名称和工程路径,在第二项页面中选择一个空的DLL工程,点击完成。工程建立好后添加C++ Source File。

在文件中编写一个完成加法运算的函数和一个完成减法运算的函数。

View Code
1 int add(int a,int b)
2 {
3 return a+b;
4 }
5 int sub(int a,int b)
6 {
7 return a-b;
8 }

编译程序,此时在工程文件夹下的Debug文件夹中会出现DLLL1.dll。

此时文件并没有被导出,可以通过DUMPBIN指令查看一个DLL文件的导出函数,具体方法如下:

1.打开命令提示符,复制相应文件下Debug文件夹的所在目录路径。转移到相应目录下。

2.输入dumpbin(dumpbin是vc6.0bin目录下的一个工具)-exports DLLL1.dll。此时将输出文件的信息。

可见没有输出函数。

修改函数代码:

View Code
1 _declspec(dllexport) int add(int a,int b)
2 {
3 return a+b;
4 }
5 _declspec(dllexport) int sub(int a,int b)
6 {
7 return a-b;
8 }

此时重新编译,然后通过dumpbin -exports DLLL1.dll可以看到已经有输出函数名。(注意此时函数名的写法,这个写法是VS按照自己的规则进行的改变,不同的编译器可能不同)

此时对DLLL.dll文件进行测试。

建立一个MFC Wizard工程,选择简单对话框。

编写两个按键的消息处理函数:

View Code
 1 extern int add(int a,int b);
2 extern int sub(int a,int b);
3 void CDLLLtestDlg::OnBtnAdd()
4 {
5 // TODO: Add your control notification handler code here
6 CString str;
7 str.Format("a+b=%d",add(5,3));
8 MessageBox(str);
9 }
10
11 void CDLLLtestDlg::OnBtnSub()
12 {
13 // TODO: Add your control notification handler code here
14 CString str;
15 str.Format("a-b=%d",sub(5,3));
16 MessageBox(str);
17 }

运行程序,发现此时程序并不能正确运行。

这是因为工程找不到DLLL1.dll文件的位置,需要复制DLLL1文件夹下的DLLL1.dll和DLLL1.lib文件到DLLLtest文件夹下。填写工程/设置为如下:

重新运行程序,可以正确运行。

可以查看可执行程序的输入信息,同样是用dumpbin,在工程DLLLtest/Debug目录下运行命令提示符。

运行指令:dumpbin -imports DLLLtest.exe则会现实工程编译所需要的所有输入函数。此时可以看到DLLL.dll所提供的函数。

另外可以通过VS所提供的图形工具查看工程都需要哪些动态链接库。在VC6.0 Tools中有一个软件叫Depends(它的主要功能就是这样),进入软件并打开需要测试的工程文件,这里为DLLLtest.exe。另外需要注意,只有exe文件和dll文件放在一起时才可以被depends识别。

右侧窗口上面列出的是程序调用的函数,下面列出的是该dll所导出的函数。

在调用dll的工程中一般不使用extern,而是使用如下写法:

View Code
 1 _declspec(dllimport) int add(int a,int b);
2 _declspec(dllimport) int sub(int a,int b);
3 void CDLLLtestDlg::OnBtnAdd()
4 {
5 // TODO: Add your control notification handler code here
6 CString str;
7 str.Format("a+b=%d",add(5,3));
8 MessageBox(str);
9 }
10
11 void CDLLLtestDlg::OnBtnSub()
12 {
13 // TODO: Add your control notification handler code here
14 CString str;
15 str.Format("a-b=%d",sub(5,3));
16 MessageBox(str);
17 }




posted on 2012-02-14 17:20  专吃兔子的大黑猫  阅读(317)  评论(0编辑  收藏  举报