VS2008中DLL的编写与调用

时间:2022-06-01 04:52:49

转自:http://blog.csdn.net/breezes2008/archive/2010/02/25/5326861.aspx

 

1。编写DLL

    a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”,

       应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。

    b)编写头文件(edrlib.h):

view plaincopy to clipboardprint?
01.#ifdef __cplusplus  
02.#define EXPORT extern "C" __declspec (dllexport)  
03.#else  
04.#define EXPORT __declspec (dllexport)  
05.#endif  
06. 
07.EXPORT void  EdrCenterTextA();  
08.EXPORT void  EdrCenterTextW();  
09.EXPORT int  IncCounter();  
10.#ifdef UNICODE  
11.#define EdrCenterText EdrCenterTextW  
12.#else  
13.#define EdrCenterText EdrCenterTextA  
14.#endif 
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT void  EdrCenterTextA();
EXPORT void  EdrCenterTextW();
EXPORT int  IncCounter();
#ifdef UNICODE
#define EdrCenterText EdrCenterTextW
#else
#define EdrCenterText EdrCenterTextA
#endif
 

注解:

    i. 定义 __cplusplus表示是供C++程序中调用。

    ii.__declspec (dllexport)表示函数调用方式,此处表示VS2008工程属性调用的默认方式。更改方法:

    右击项目--属性--配置属性--C/C++--高级,更改右侧“调用约定”。

    c)编写DLL文件(edrlib.cpp):

view plaincopy to clipboardprint?
01.#include "windows.h"  
02.#include "edrlib.h"  
03.//counter供调用该DLL的所有应用程序共享  
04.#pragma data_seg("shared")  
05.int counter=0;  
06.#pragma comment(linker,"/SECTION:shared,RWS")  
07. 
08.int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)  
09.{  
10.    return TRUE;  
11.}  
12. 
13.EXPORT void   EdrCenterTextA()  
14.{  
15.    MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);  
16.      
17.}  
18.EXPORT void  EdrCenterTextW()  
19.{  
20.    MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);  
21. 
22.}  
23. 
24.EXPORT int  IncCounter()  
25.{  
26.    return ++counter;  
27.} 
#include "windows.h"
#include "edrlib.h"
//counter供调用该DLL的所有应用程序共享
#pragma data_seg("shared")
int counter=0;
#pragma comment(linker,"/SECTION:shared,RWS")

int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)
{
 return TRUE;
}

EXPORT void   EdrCenterTextA()
{
 MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);
 
}
EXPORT void  EdrCenterTextW()
{
 MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);

}

EXPORT int  IncCounter()
{
 return ++counter;
}

  c)编译生成DLL。

2。调用DLL

   方法一、

   1。新建Win32应用程序空项目。

   2。把生成的dll、lib这2个文件复制到新建的目录下。

   3。添加导入库:工具--项目和解决方案--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。

   4。头文件:edrlib.h(与编写DLL中一样)

   5。源文件:main.c

  
view plaincopy to clipboardprint?
01./*#define cplusplus*/ //c++调用方式  
02.#include "windows.h"  
03.#include "edrlib.h"  
04.#pragma comment(lib,"edrlib.lib")  
05. 
06.int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )  
07.{  
08. 
09.    TCHAR buf[32];  
10.    wsprintf(buf,L"now,counter=%i",IncCounter());  
11.    MessageBox(NULL,buf,L"--",MB_OK);  
12.    EdrCenterText();  
13.    return 0;  
14.} 
/*#define cplusplus*/ //c++调用方式
#include "windows.h"
#include "edrlib.h"
#pragma comment(lib,"edrlib.lib")

int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{

 TCHAR buf[32];
 wsprintf(buf,L"now,counter=%i",IncCounter());
 MessageBox(NULL,buf,L"--",MB_OK);
 EdrCenterText();
 return 0;
}

   解释:

   可注释#pragma comment(lib,"TestDLL2.lib")这条,但必须设置链接库,方法:

   右击项目--属性--配置属性--链接器--输入--附加依赖项:edrlib.lib

  6.运行测试成功。