VC++ DLL编程笔记(一)
Published by wonglaye 三月 24th, 2006 in VC
动态链接库DLL同静态Lib链接的区别在于:程序在编译成可执行文件时会把静态链接库中的程序拷进可执行文件中,所以Lib文件是不用同可执行文件一同发布的。而链接到动态库DLL中时要通过一个Lib文件,Lib文件保存了函数或类在DLL中的入口地址,可执行文件中相应存放的也是函数地址,所以DLL和Lib要同可执行文件一起发布。
1. VC中支持的DLL种类:Non MFC DLL,Regular DLL,Exetension DLL
Non MFC DLL 非MFC动态链接库:不使用MFC类库结构,直接用C写,输出函数用标准C接口,能被非MFC程序调用
Regular DLL 正则动态链接库:使用MFC编写,源文件中有继承自CWinApp的类,只能被MFC调用;正则Dll又分成静态连接到MFC的和动态链接到MFC的,在创建时会看到。
Extension DLL 扩展动态链接库:实现从MFC继承下来的新类,输出MFC新子类,只能被MFC调用
实践:在新建菜单中选择新建工程Win32 Dynamic Link Library,选择simple project,加入自己的函数MyFunction:
#include “stdafx.h”
//#include “DLL.h”
//也可省略Extern “C”,它的作用是使其他语言可以访问到
extern “C” _declspec(dllexport) int MyFunction();//可以将这一行放在DLL.h里,也可用.def文件创建
//入口地址
BOOL APIENTRY DllMain( HANDLE hModule, //指向自身的句柄
DWORD ul_reason_for_call, //Dll被调用的原因
LPVOID lpReserved//保留参数
)
{
switch (ul_reason_for_call)//调用原因
{
case DLL_PROCESS_ATTACH://进程被调用
case DLL_THREAD_ATTACH://线程被调用
case DLL_THREAD_DETACH://进程被停止
case DLL_PROCESS_DETACH://线程被停止
break;
}
return TRUE;
}
int MyFunction()//自定函数
{
return 886;
}
编译后即可生成DLL文件和相应的Lib文件
Published by wonglaye 三月 24th, 2006 in VC
动态链接库DLL同静态Lib链接的区别在于:程序在编译成可执行文件时会把静态链接库中的程序拷进可执行文件中,所以Lib文件是不用同可执行文件一同发布的。而链接到动态库DLL中时要通过一个Lib文件,Lib文件保存了函数或类在DLL中的入口地址,可执行文件中相应存放的也是函数地址,所以DLL和Lib要同可执行文件一起发布。
1. VC中支持的DLL种类:Non MFC DLL,Regular DLL,Exetension DLL
Non MFC DLL 非MFC动态链接库:不使用MFC类库结构,直接用C写,输出函数用标准C接口,能被非MFC程序调用
Regular DLL 正则动态链接库:使用MFC编写,源文件中有继承自CWinApp的类,只能被MFC调用;正则Dll又分成静态连接到MFC的和动态链接到MFC的,在创建时会看到。
Extension DLL 扩展动态链接库:实现从MFC继承下来的新类,输出MFC新子类,只能被MFC调用
实践:在新建菜单中选择新建工程Win32 Dynamic Link Library,选择simple project,加入自己的函数MyFunction:
#include “stdafx.h”
//#include “DLL.h”
//也可省略Extern “C”,它的作用是使其他语言可以访问到
extern “C” _declspec(dllexport) int MyFunction();//可以将这一行放在DLL.h里,也可用.def文件创建
//入口地址
BOOL APIENTRY DllMain( HANDLE hModule, //指向自身的句柄
DWORD ul_reason_for_call, //Dll被调用的原因
LPVOID lpReserved//保留参数
)
{
switch (ul_reason_for_call)//调用原因
{
case DLL_PROCESS_ATTACH://进程被调用
case DLL_THREAD_ATTACH://线程被调用
case DLL_THREAD_DETACH://进程被停止
case DLL_PROCESS_DETACH://线程被停止
break;
}
return TRUE;
}
int MyFunction()//自定函数
{
return 886;
}
编译后即可生成DLL文件和相应的Lib文件