如何制作库2
2010年01月20日
下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、
类。
一、 函数的定义和使用方法:
第一步:
运行AppWizard,定义项目名为mydll,选择MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在这个例子中,只有一个AppWizard屏幕出现,选择MFC扩展DLL(MFC Extension DLL (using shared MFC DLL),点击
FINISH生成工程。
第三步:
点击File中的New,选择C/C++ Header File,File Name中输入dll,点击OK,创建dll.h。输入extern "C" __declspec(dllexport)
int fun(int x1,int x2,int x3); ,保存。
第四步:
点击File中的New,选择C++ Source File,File Name中输入dll,点击OK,创建dll.cpp。输入
#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
编译生成mydll.dll和mydll.lib。
第五步:
选择Project 中Add To Project 中的New , 重新生成一个工程,选择MFC AppWizards(exe),项目名为mydlltest , 选择Single
Document ,点击FINISH,生成一个新的工程。选择菜单中的Project àSet Active Project àmydlltest ,将mydlltest设为当前活动工程
。
第六步:
拷贝…\mydll\debug\mydll.dll 到 ..\mydlltest\debug\下,拷贝…\mydll\debug\mydll.lib到…\mydlltest\目录下。
第七步:
在mydlltestView.cpp中的#endif下添加
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中添加代码如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int x=fun(1,2,3);
CString str;
str.Format("%d",str);
pDC->TextOut(10,10,x);
}
第八步:
在WorkSpace中的mydlltest files上点击右键,选择Add files to Project ,将mydll.dll添加到工程。
好了,我们的工作做完了,运行一下看看吧!
二、 类的添加和使用步骤:
在mydll中生成一个新类,类的声明处改为class AFX_EXT_CLASS CMyClass ,在此类中和其他类一样添加自己需要的变量
和函数,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个myclass.h文件,拷贝mydll中
myclass.h的所有代码到新生成的myclass.h中。在需要使用dll中CmyClass类的文件中包含myclass.h,然后我们就可以向其他类
一样使用该类了。
三、 字符串的定义和使用
在mydll中定义字符串资源,编译生成新的dll和lib,重复上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR
1(假设我们定义的字符串资源的ID号为IDS_MYSTR),在需要是要该字符串的地方添加#include "myclass.h",即可使用该字
符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 对话框的定义和使用
在mydll中定义对话框资源,生成一个新类CDlg,类的声明处改为class AFX_EXT_CLASS CDlg : public CDialog ,像其他对
话框一样定义对话框的属性和功能,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个dlg.h文件
,拷贝mydll中dlg.h的所有代码到新生成的dlg.h中。在需要使用dll中此对话框资源的文件中包含dlg.h,然后我们就可以向其他
对话框一样使用此对话框了。
CDlg dlg;
dlg.DoModal();
好了,到这里我们所有的功能就都实现了,快编译运行一下吧!
如何用VC编写DLL动态链接库文件【http://oss.lzu.edu.cn/blog/article.php?tid_176.html】
用vc编写动态链接库,用vc调用
1、创建DLL文件,命名为FIRSTDLL
1)打开visual c++ 6.0通过new创建一个win30 Dynamic-link Libary的工程,命名为FIRSTDLL
2)接着选择最后一个选项,让系统帮我们创建一些必要的文件
3)把FIRSTDLL.cpp用下面的代码覆盖
Code:
// FIRSTDLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h" //这个文件定义了源程序为C++格式。 否则文件需要保存为.C格式
#include "FIRSTDLL.h"
int Max(int a, int b) //定义一个函数MAX,实现求两个数的最大数
{
if(a>=b)return a;
else
return b;
}
4)接着我们在FIRSTDLL.h头文件里头用下面的代码覆盖
Code:
extern "C" _declspec(dllexport) int Max(int a, int b);
//一是在定义函数时使用导出关键字_declspec(dllexport),
//另外,可以通过创建.def文件来导入函数,具体见最后的参考资料
5)好拉,我们现在可以编译FIRSTDLL.cpp文件拉,到debug目录下看看,是不是已经生成拉我们需要的FIRSTDLL.dll拉
简单做法:
最最简单的就是New->工程->Win32 Dynamic-link libary然后填写工程名后点击OK->空项目然后分别创建一个.h和一个.cpp文件,在.h文件当中将你要导出的变量或者函数名写成如下的形式:
extern int a;
extern int funcA(int b,char* c,int len);//注意返回值如果为空时,最好还是用一个常规的类型来代替,因为很多的程序不会识别void 类型.
然后在cpp文件当中写成如下的形式
int a;
int funcA(int b,char*c,int len){//函数实现}
下面的最重要:
新建一个文件取名为 **.def
在该文件当中用下面的方式导出变量或者函数名称
@EXPORTS
a
funcA
然后编辑之后就生成了.lib和.dll文件了,
然后将上面的那两个文件放入你想要调用的地方,然后类型对应到相应的程序当中就可以了.
如果你要把生成的库在SDK和MFC里面用,只要在头文件里写上
#IFDEF CPLUSPLUS就行了,没什么特别需要注意的.
在.def文件中写上提供的接口函数。
functioname @1
functioname @2
编译出.obj
执行命令
lib xxx.obj /out:your.lib
需要注意的是.obj的编译方式(debug or release/multi or single threaded)对产生的lib有影响。所以建议对每个.obj built 4种版本。
新建一个工程,选择MFC DLL工程,在第二步的三个选项中请选第二个,以建立一个常规的DLL,在你的每一个函数声明前请加上 __declspec(dllexport) ,这样就能导出函数以供其他程序访问。编译连接后就会生成一个lib文件。如果还是在VC里用,使用时请使用__declspec(dllimport) 导入函数声明,并在连接设置里加上的lib文件。
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
故:静态lib库可以看成是obj的集合.而动态库对应的lib导入库,不含目标代码.
2010年01月20日
下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、
类。
一、 函数的定义和使用方法:
第一步:
运行AppWizard,定义项目名为mydll,选择MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在这个例子中,只有一个AppWizard屏幕出现,选择MFC扩展DLL(MFC Extension DLL (using shared MFC DLL),点击
FINISH生成工程。
第三步:
点击File中的New,选择C/C++ Header File,File Name中输入dll,点击OK,创建dll.h。输入extern "C" __declspec(dllexport)
int fun(int x1,int x2,int x3); ,保存。
第四步:
点击File中的New,选择C++ Source File,File Name中输入dll,点击OK,创建dll.cpp。输入
#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
编译生成mydll.dll和mydll.lib。
第五步:
选择Project 中Add To Project 中的New , 重新生成一个工程,选择MFC AppWizards(exe),项目名为mydlltest , 选择Single
Document ,点击FINISH,生成一个新的工程。选择菜单中的Project àSet Active Project àmydlltest ,将mydlltest设为当前活动工程
。
第六步:
拷贝…\mydll\debug\mydll.dll 到 ..\mydlltest\debug\下,拷贝…\mydll\debug\mydll.lib到…\mydlltest\目录下。
第七步:
在mydlltestView.cpp中的#endif下添加
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中添加代码如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int x=fun(1,2,3);
CString str;
str.Format("%d",str);
pDC->TextOut(10,10,x);
}
第八步:
在WorkSpace中的mydlltest files上点击右键,选择Add files to Project ,将mydll.dll添加到工程。
好了,我们的工作做完了,运行一下看看吧!
二、 类的添加和使用步骤:
在mydll中生成一个新类,类的声明处改为class AFX_EXT_CLASS CMyClass ,在此类中和其他类一样添加自己需要的变量
和函数,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个myclass.h文件,拷贝mydll中
myclass.h的所有代码到新生成的myclass.h中。在需要使用dll中CmyClass类的文件中包含myclass.h,然后我们就可以向其他类
一样使用该类了。
三、 字符串的定义和使用
在mydll中定义字符串资源,编译生成新的dll和lib,重复上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR
1(假设我们定义的字符串资源的ID号为IDS_MYSTR),在需要是要该字符串的地方添加#include "myclass.h",即可使用该字
符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 对话框的定义和使用
在mydll中定义对话框资源,生成一个新类CDlg,类的声明处改为class AFX_EXT_CLASS CDlg : public CDialog ,像其他对
话框一样定义对话框的属性和功能,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个dlg.h文件
,拷贝mydll中dlg.h的所有代码到新生成的dlg.h中。在需要使用dll中此对话框资源的文件中包含dlg.h,然后我们就可以向其他
对话框一样使用此对话框了。
CDlg dlg;
dlg.DoModal();
好了,到这里我们所有的功能就都实现了,快编译运行一下吧!
如何用VC编写DLL动态链接库文件【http://oss.lzu.edu.cn/blog/article.php?tid_176.html】
用vc编写动态链接库,用vc调用
1、创建DLL文件,命名为FIRSTDLL
1)打开visual c++ 6.0通过new创建一个win30 Dynamic-link Libary的工程,命名为FIRSTDLL
2)接着选择最后一个选项,让系统帮我们创建一些必要的文件
3)把FIRSTDLL.cpp用下面的代码覆盖
Code:
// FIRSTDLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h" //这个文件定义了源程序为C++格式。 否则文件需要保存为.C格式
#include "FIRSTDLL.h"
int Max(int a, int b) //定义一个函数MAX,实现求两个数的最大数
{
if(a>=b)return a;
else
return b;
}
4)接着我们在FIRSTDLL.h头文件里头用下面的代码覆盖
Code:
extern "C" _declspec(dllexport) int Max(int a, int b);
//一是在定义函数时使用导出关键字_declspec(dllexport),
//另外,可以通过创建.def文件来导入函数,具体见最后的参考资料
5)好拉,我们现在可以编译FIRSTDLL.cpp文件拉,到debug目录下看看,是不是已经生成拉我们需要的FIRSTDLL.dll拉
简单做法:
最最简单的就是New->工程->Win32 Dynamic-link libary然后填写工程名后点击OK->空项目然后分别创建一个.h和一个.cpp文件,在.h文件当中将你要导出的变量或者函数名写成如下的形式:
extern int a;
extern int funcA(int b,char* c,int len);//注意返回值如果为空时,最好还是用一个常规的类型来代替,因为很多的程序不会识别void 类型.
然后在cpp文件当中写成如下的形式
int a;
int funcA(int b,char*c,int len){//函数实现}
下面的最重要:
新建一个文件取名为 **.def
在该文件当中用下面的方式导出变量或者函数名称
@EXPORTS
a
funcA
然后编辑之后就生成了.lib和.dll文件了,
然后将上面的那两个文件放入你想要调用的地方,然后类型对应到相应的程序当中就可以了.
如果你要把生成的库在SDK和MFC里面用,只要在头文件里写上
#IFDEF CPLUSPLUS就行了,没什么特别需要注意的.
在.def文件中写上提供的接口函数。
functioname @1
functioname @2
编译出.obj
执行命令
lib xxx.obj /out:your.lib
需要注意的是.obj的编译方式(debug or release/multi or single threaded)对产生的lib有影响。所以建议对每个.obj built 4种版本。
新建一个工程,选择MFC DLL工程,在第二步的三个选项中请选第二个,以建立一个常规的DLL,在你的每一个函数声明前请加上 __declspec(dllexport) ,这样就能导出函数以供其他程序访问。编译连接后就会生成一个lib文件。如果还是在VC里用,使用时请使用__declspec(dllimport) 导入函数声明,并在连接设置里加上的lib文件。
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
故:静态lib库可以看成是obj的集合.而动态库对应的lib导入库,不含目标代码.