Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1326612
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2010-06-13 18:00:32

在Visual C++ .NET 2003中File|New|Projects, Project Types对话框中选择Visual C++ Project | Win32 | Win32 Project.在Application Wizard对话框中选择Application Settings选项页, Application Type选择DLL。

建立工程后开始书写你的函数。如果函数需要导出,请建立一个.h文件。添加下面的内容。

dll.h:

#ifndef _DLL_H
#define _DLL_H
#ifdef DLL
	#define EXTERN extern "C" __declspec(dllexport)
#else
	#define EXTERN extern __declspec(dllimport)
#endif

EXTERN int add(int, int);

#endif // _DLL_H

同时要修改你的.cpp文件

dll.cpp:

#define DLL
#include "FaceRec.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

EXTERN int add(int a, int b) {
	// Something to do
	return a + b;
}

这样就声明导出了一个add(int, int)函数。

这里需要说明几点,要特别注意:

  1. 由于是使用C++语言,C++支持函数重载。因此导出函数的函数明会因为重载有所变化。所以需要加上 extern "C" 强制使用C语言进行导出。当然这样一来,导出函数也就不能出现重载版本了。
  2. 另外,由于很多DLL的使用者是使用.lib文件+.h文件的方法(静态方法)访问DLL的,而非LoadLibrary + GetProcAddress的方法(动态方法)。因此我们书写.h文件的时候做一个宏判断如果是在DLL编译中,就定义EXTERN为__declspec(dllexport)。如果是用户使用就定义EXTERN为extern __declspec(dllimport)。
  3. 对于C++导出给其他语言(Delphi, C++ Builder)的DLL.要根据其他语言函数的调用方式(Calling Convention)加入适当的修饰符。比如给delphi要用pascal修饰,给Windows API回调要使用stdcall等等。

DLL输出正确与否的检测

进入在Visual Studio .NET 2003的Visual .NET Tools里Visual .NET Command Prompt命令行模式。输入命令

dumpbin /exports dll.dll

来显示dll的导出表,可以看看导出的函数数量和名称是否正确。再对自己的程序进行调整

阅读(747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~