欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动态库的创建和调用

程序员文章站 2022-03-03 20:50:49
...

一、动态库的创建

新建工程–》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的路径注册)–》注册成功

执行运行!

相关标签: