源代码:http://download.csdn.net/detail/nuptboyzhb/4132266
(1)非MFC动态链接库编程
一. 非MFC动态链接库的生成;
1. 新建一个Win32 Dynamic-Link Library工程;命名为DLLTest;在下一步中选择的时候,选择一个简单的Dll工程。点击完成
2. 打开,DllTest.cpp文件,完善DllMain函数;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH://进程加载时调用
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH://进程结束时调用
break;
default:
break;
}
return TRUE;
}
3. 编写自己的导出函数或变量;
如‘加’函数、阶乘函数和自己的消息框函数:
int Add(int x,int y)
{
return x+y;
}
int MyMultiply(int x)
{
if (x<0||x>30)
{
return -1;
}
else
{
int sum=1;
for(int i=1;i<=x;i++)
{
sum*=i;
}
return sum;
}
}
void MyMessageBox(char *str)
{
MessageBox(NULL,str,"Dll内部的函数哦!",MB_OK);
}//注意,要加上头文件#include<windows.h>
4. 定义.def文件,声明导出的函数或变量
新建一个.def格式的文本文件,并将其加入到工程;然后编写代码如下
LIBRARY DllTest
EXPORTS
Add @1
MyMultiply @2
MyMessageBox @3
/*其中,最重要的就是要注意LIBRARY和EXPORTS这两个关键字,LIBRARY 后面一定要跟工程名保持一致,否则会出错;EXPORTS后面为要导出的变量或着函数;本次导出了三个函数;注意,‘@’后面为导出的序号,一般为一个整数;注意不同的资源导出的序号要不相同;*/
5. 点击Build All;在Debug的文件夹下,出现一个DllTest.dll的文件名称;这个就是我们需要的动态连接库;
二. 非MFC动态链接库的使用;(动态方式)
1. 新建一个多文档的MFC应用程序;
2. 新增菜单项,编辑代码:以下是加函数的调用
typedef int(*pFun)(int ,int );
HINSTANCE hDLL;
pFun MyAdd;
hDLL=LoadLibrary("DllTest.dll");
if (hDLL!=NULL)
{
MyAdd=(pFun)GetProcAddress(hDLL,"Add");
int x=10;
int y=12;
int z;
z=MyAdd(x,y);
CString str;
str.Format("%d",z);
str="10+12="+str;
MessageBox(str);
}
else
{
MessageBox("DllTest.dll加载失败!请将DllTest.dll复制到当前目录下");
}
FreeLibrary(hDLL);
三. 静态调用
1. 新增菜单项,编辑代码:以下是加函数的调用和自定义提示框的调用;
int MyMultiply(int x);
void MyMessageBox(char *str);
void CUseDLLView::OnStaticMul()
{
#pragma comment(lib,"DllTest.lib")
int x=5;
int z;
z=MyMultiply(x);
CString str;
str.Format("%d",z);
str="5!="+str;
MessageBox(str);
MyMessageBox("你好!");
}
(2)非MFC动态链接库编程
一.MFC动态链接库的编程
1.新建一个MFC的DLL工程,命名为MfcDll.点击完成;VC++6.0会自动给生成一些代码;这些代码可以直接编译;
2.插入一个对话框资源,并新建一个对应的类;命名为CDllDlg
3.新建一个CDllDlg类型的全局指针CDllDlg *dlg=NULL;
4.编写void MyDllDlg()函数
void MyDllDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
dlg=new CDllDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
}
注意,每一个函数尽量要带AFX_MANAGE_STATE(AfxGetStaticModuleState());这条语句;
5.在.def文件中加入导出声明; MyDllDlg @1
二.测试