一、生成DLL文件
1、菜单项“文件”——>“新建”——>“工程”——>“Win32 Dynamic-Link Library”。创建一个工程项目,为这个工程取个名字为“test”。在这里我选择“创建一个简单的DLL”,此时在VC++界面上会有一个树形文件结构。
2、看到这个文件结构就大概明白,Source Files是放源码的,也就是以.cpp为后缀的文件;Header Files就是以放头文件,也就是以.h为后缀的文件。这个StdAfx.h和StdAfx.cpp都是自动生成的,这个StdAfx.h是一些默认的配置,这个不需要我们去动它。反正有了这个文件,我们只要在我们的源文件(如test.cpp)中引入这个头文件就行了。
test.cpp的默认文件如下:
#include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
3、假设现在我要实现一个a+b的功能,并将这个功能打包成一个动态链接库(DLL),供其他的程序调用。代码如下:
#include "stdafx.h" extern "C"_declspec(dllexport) int fun(int a,int b); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } int fun(int a,int b) { return a+b; }
extern "C"_declspec(dllexport) int fun(int a,int b)就是将这个方法导出,也就是把这个接口提供给其他程序。当然,如果还要定义其他的方法,都要用这个语句把这个接口暴露出来。
4、此时,我们“build”工程,也就是组建一下。如果成功的话,就能在工程目录下的Debug目录下找到一个“test.dll”的文件。
二、调用DLL文件
1、菜单项“文件”——>“工程”——>“Win32 Console Application”。创建一个Console应用,为这个应用取名为“calling”。此时再VC++的界面会出现一个属性文件结构。
2、我们将上面生成的test.dll文件放到我们这个应用的calling目录下;然后在calling.app文件中填写如下代码:
1 #include "stdafx.h" 2 typedef int(*pfun)(int,int); 3 4 int main(int argc, char* argv[]) 5 { 6 HMODULE hModule=::LoadLibrary("test.dll"); 7 pfun newfun=(pfun)::GetProcAddress(hModule,"fun"); 8 int i=newfun(1,2); 9 printf("the result is %d\n",i); 10 ::FreeLibrary(hModule); 11 return 0; 12 }
3、最后一步进行编译,运行,正常来说能通过,但是编译通不过,说“HMODULE”这样的关键字没有定义。打开标准配置头文件stdafx.h,内容默认如下:
#if !defined(AFX_STDAFX_H__94A5270F_2E93_4D92_8279_BDF69332D688__INCLUDED_) #define AFX_STDAFX_H__94A5270F_2E93_4D92_8279_BDF69332D688__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <stdio.h>
我们把这个文件添加如下:
#if !defined(AFX_STDAFX_H__9CD74EA8_AC0B_4487_98D5_E8704B271E95__INCLUDED_) #define AFX_STDAFX_H__9CD74EA8_AC0B_4487_98D5_E8704B271E95__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #if def_DEBUG #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #endif #include <stdio.h> #include <Windows.h>
这样就能编译通过,我们这个应用就能调用DLL文件中定义的方法了。