VS2008中DLL的编写与调用

转自: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.运行测试成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值