Win32 DLL

 

Win32 DLL

空间太空了,有些过意不去,刚好最近因为学习需要写了一个多线程的 win32 DLL 类,就把大概的过程贴出来跟大家分享一下,水平有限,大家轻拍。

这是第一个帖子,主要是讲怎么用 Visual Studio 创建隐式链接的 Win32 DLL ,多线程类的编写在另外一个帖子里会有介绍。

编译隐式链接的 DLL 工程时,会生成两个有用的文件,一个是 LIB 文件,另外一个是 DLL 文件。在客户程序中,需要添加 LIB 文件和 DLL 文件拷贝过去才能调用。

废话少说,下面就一步步地讲述怎么用一个 Win32 DLL 封闭函数和类。

Win32 DLL 封装函数

首先应用 VS 的向导新建一个 Win32 控制台应用程序:

在应用程序设置中选择 DLL 类型和空项目:

完成以后在其中新建一个名为 Win32DLL.cpp 的源文件。在其中添加如下代码 ( 为了能够突出 DLL 工程的结构,在这里我尽量去掉无关的内容 )

//Win32DLL.cpp 文件

#include <iostream>

void displayResult (int a )

{

     std ::cout <<"Add 函数调用成功" <<"a=" <<a <<std ::endl ;

}

 

__declspec (dllexport ) int Add (int a , int b )

{

     displayResult (a + b );

     return (a + b );

}

 

__declspec (dllexport ) void Function ()

{

     std ::cout <<"DLL 调用成功" <<std ::endl ;

}

现在编译一下,就可以得到一个完整的 LIB DLL 了。可以看到,该文件中仅包含两种函数,其中用 __declspec (dllexport ) 修饰的函数表示该函数是 DLL 的导出函数,而没有该修饰字的是 DLL 内部函数。

Win32 DLL 封装类

下面将演示如何将类封装到 DLL 中。首先在解决方案目录中添加一个 Win32 DLL 工程,建好以后用类向导添加一个 C++ CTest ,在类的头文件中添加一些自定义的函数和变量,然后将类的声明 class CTest 改为 class __declspec(dllexport) CTest 就可以了。 Test.h Test.cpp 的代码如下

//Test.h 文件

#pragma once

 

class __declspec (dllexport ) CTest

{

public :

     CTest (void );

public :

     ~CTest (void );

 

public :

     int a ;

public :

     void Add (void );

};

 

//Tes.cpp 文件

#include "Test.h"

#include <iostream>

 

CTest ::CTest (void )

{

     a = 0;

}

 

CTest ::~CTest (void )

{

}

 

void CTest ::Add ()

{

     a ++;

     std ::cout <<a <<std ::endl ;

}

在程序中调用 Win32 DLL

       为了测试上面的两个 DLL ,我写了一个简单的程序来调用它们。首先新建一个名为 Win32DLLTest 的工程,将前面两个工程生成的 LIB 文件和 DLL 文件拷贝到工程目录下面。然后在工程中添加 main.cpp 文件, main.cpp 文件的内容如下:

#include <iostream>

 

// 载入lib 文件,也可以在工程属性中设置

#pragma comment (lib , "Win32DLL.lib" )

#pragma comment (lib , "Win32DLLCLS.lib" )

 

// DLL 导入的函数和类的声明

__declspec (dllimport ) int Add (int a , int b );

__declspec (dllimport ) void Function ();

 

class __declspec (dllimport ) CTest

{

public :

     CTest (void );

public :

     ~CTest (void );

 

public :

     int a ;

public :

     void Add (void );

};

 

//main 函数

void main ()

{

     Function ();

     std ::cout <<Add (30, 40)<<std ::endl ;

 

     CTest test_cls ;

     test_cls .Add ();

     test_cls .Add ();

     test_cls .Add ();

}

 

其中 __declspec (dllimport ) 修饰符表示这些函数和类是从 DLL 导入的。注意类 CTest 的声明必须写全,否则会提示错误。

程序的运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值