Skip navigation

DLL的基本结构

在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的导出表,可以看看导出的函数数量和名称是否正确。再对自己的程序进行调整

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>