动态库的创建和调用
一、动态库的创建
新建工程–》win32 Dynamic-Link Library-》创建三个文件,如下内容
动态库是Microsoft Windows组件模型的核心,动态库是一个可执行的模块,包含一些独立的文件,但是额应用程序不同,动态链接库没有自己的消息循环,且不能单独执行,需要通过应用程序或者其他发动态库调用才能被执行,动态库一般是封装了一些函数的功能的函数集合,用来提供给其他的函数来调用;
文件1:主要是输出函数
文件名:sample_01.def (名字以.def后缀)
内容:EXOPRT是关键字,
是动态库的输出函数(只是函数名)
文件2:sample_01.h (头文件)
内容:
#ifndef SAMPLE_01_H //防止重复引用头文件
#define SAMPLE_01_H
#ifdef _cplusplus
exter "c"{
#endif
int _stdcall add(int a,int b);
#ifdef _cpluslus
}
#endif
#endif
文件3:Main.cpp 实现了add的方法
#include<stdio.h>
#include"sample_01.h"
//_stdcall 是一个调用的关键字,从右向左开始传参
int _stdcall add(int a,int b){
return a+b;
}
将文件1、文件2、文件3一起编译链接、执行。生成了一个sample_01.dll的动态库。
文件1是一个模板,告诉编译器下面的函数是输出函数,文件2是一个声明的过程,文件3是一个函数实现的过程;
内部调用的时候:
我们自己封装的动态库,在使用的时候,有几点需要注意:
1.必须自己实现,不能调用系统函数;
2.我么可以同时封装多个函数,只要将他们全部定义在EXPORT后面,并且都实现;
3.返回值没有要求,可以是int,也可以char,char *,void,都是可以的;
4.使用时,我们必须找到静态库.lib,这个是直接指定在头文件中;动态库是在链接的时候,我们自己手动移动过去的;
5.每一次改变动态库,都必须重新编译。
6.再文件中_stdcall是windows下API的默认调用方式,我们也可以换成c的调用方式_cdecl的,只是告诉编译器他们的入参顺序和堆栈的清理工作的安排;
7.对于重载函数也是可以执行的,但是必须加修饰;
二、动态库的调用
创建一个工程–》Win32 Console Application ->添加一个main.cpp调用一下自己创建的动态库
我们自己实现的动态库,我们调用一下
#include<stdio.h>
#include "../text/text.h" //找到自己创建的动态库的头文件
#ifdef _DEBUG
#pragma comment(lib,"../text/Debug/text.lib")//在debug指定静态库的路径
#else
#pragma comment(lib,"../text/Release/text.lib")//在release版本下,指定路径
#endif
//将生成的动态库,将.dll移动到当前项目下debug和release下;
int main(int argc,char *argv[])
{
printf("99+55=%d\n",add(99,55));
printf("99/3=%d\n",dev(99,3));
int s = 10;
strrevd(&s);
printf("%d\n",s);
return 0;
}
三、自己封装组件
新建一个ATL COM AppWizard ->对于一个类添加Controls控件-》full Control添加一个复合控件–》给这个控件添加一个方法-》分别输入方法名称-方法参数([in] int a
/[in]是输入,[out,Retval]时输出/)
简单功能的实现
四、
新建一个 MFC AppWizard [exe]->选择基本对话框-》完成–》出现一个控制面板–》插入控件–》属性改成不可见–》建立类向导-》选择一个类-》为该类添加一个变量–》添加成员变量名–》注册第三个中的组件(打开运行窗口-》输入rehsvr 32 +第三个组件中的.dll的路径注册)–》注册成功
执行运行!
下一篇: 硬盘里的资料突然失踪:PC电源也会是祸首