dll编写总结

源代码: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

二.测试

你可能感兴趣的:(dll)