当前位置:首页 » 编程软件 » vc动态链接库dll编程

vc动态链接库dll编程

发布时间: 2022-07-08 14:34:48

‘壹’ VC6.0如何创建以及调用动态链接库实例详解

动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件。
同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。
VC++支持的DLL:
DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。
导出函数的声明方式:
一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
LIBRARY 库工程名称
EXPORTS 导出函数名
DLL的调用方式:
一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
所有库工程编译时必须Release方式:
Build—set active configuration—选择库工程的release方式
一、 函数----创建动态链接库(MFC规则DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll
2. def文件中添加:函数名(Add_new)
3. h文件中添加:外部函数声明//求和函数,函数名为Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp文件中添加: 外部函数实现
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需
二、 函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)
//静态调用(.h可以写到.cpp文件中)
1. new--projects--win32 console application--an empty project
2. 添加h文件:(test.h)
#pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数
3. 添加cpp文件:(main.cpp)
#include "test.h"
int main()
{
cout<<Add_new(10,3);
return 0;
}
//动态调用
#include <stdio.h>
#include <windows.h>
typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型
int main()
{
HINSTANCE hDll;//句柄
lpAddFun addFun;//函数指针
hDll=LoadLibrary("dllTest.dll");//动态加载DLL模块句柄
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加载DLL模块中函数的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);//释放已经加载的DLL模块
}
return 0;
}
三、 变量----创建动态链接库(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 添加sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 添加 sample.cpp
#include "sample.h"
#include <windows.h>
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,LPVOID lpReserved)
//windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。所以引入一个不做任何操作的缺省DllMain的函数版本。是DLL的内部函数。

‘贰’ 使用vc++6.0 如何编写dll

资源简介一、前言 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。 在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。 既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL是程序开发人员不得不解决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个DLL中实现比较最大、最小整数这两个简单函数,全面地解析了在Visual C++编译环境下编程实现DLL的过程,文章中所用到的程序代码在Windows98系统、Visual C++6.0编译环境下通过。 二、DLL的概念 DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。DLL库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。 在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。 微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL: 指的是不用MFC的类库结构,直接用c语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL: 和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。 常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。 扩展DLL:是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。MID 驱动分析之一: TP下载通过IBM存储解决方案应对信息爆炸问题Qt 游戏开发必备!【下载】Android图书及教学视频您的IT安全来自System X服务器Win8 Winrt中高性能处理多条件语句

‘叁’ 关于《VC++动态链接库(DLL)编程深入浅出》中的一点疑问

这个错误一般就是包含头文件的问题,如果你是mFC的东西,需要在每个cpp文件中加入(afx.h)很多时候,都容易漏,然后你在做Dll的时候,就可以包含MFC工程文件,还有不行的话,可以尝试生成RElease 版本

‘肆’ 如何在VC程序中加入一个动态链接库(dll文件)

DLL是用什么语言做的?
如果有.lib文件,将其加到工程中就可以使用其中的函数了.
如果没有,那用LoadLibrary加载DLL到工程中.

‘伍’ VC2010 C++ 如何编写一个 简单的DLL(动态链接库) C++大牛 请进

下面示范一下用VS2010编写纯DLL,就是非ATL,MFC。


第一步:新建工程->选择WIN32->WIN32 项目->选择DLL,并且把下面的 空项目 勾选上


第二步:再新建一个.cpp文件 里面编写你的Dll具体内容


第三步:编写一个.def主要用来解决编码问题


好了,这就基本上是完成了Dll编写了。

如果说的太详细了,我怕这页面容不下额。

我以前写过这方面的文章,你可以去参看一下:

钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键:http://blog.csdn.net/qingjun/article/details/25861615

‘陆’ VC++调用动态链接库DLL

typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);是定义函数指针类型,给类型名为MYFUNC,之后就可以用MYFUNC来定义函数指针youFuntionNameAlias,
youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");就是给函数指针赋值。就像定义结构一样,先定义结构类型,之后就可以使用结构类型顶一个结构变量,然后就可以对结构变量赋值。

‘柒’ 写出vc动态连接库的方法之一

用VC++6.0制作动态链接库的步骤 :
动态链接库(dll)是包含共享函数库的二进制文件,可以被多个应用程序同时使用。建立应用程序的可执行文件时,不必将DLL连接到应用程序中,而是在运行时动态装载DLL,装载时DLL被映射到调用进程的地址空间中。通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一:
(1)Windows的系统目录:\windows\system;
(2)DOS 中path所指出的任何目录;
(3)程序所在的目录;
本设计用的是第三种。
3.2.1动态链接库(DLL)结构
1.实现文件(.cpp文件为例)
包含DLL入口点处理函数和导出函数,以及被导出函数调用的函数的代码。
格式如下:
#include "stdafx.h" //加入所使用的相关头文件
#include "oil.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
BOOL APIENTRY DllMain( HANDLE hMole,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
以下为各函数:(被调用函数和导出函数之一)
void WINAPI sub(double a, double b, double c)
注:DLLMain 表示在Windows中DLL开始执行的地方。
2.模块定义文件(.DEF)是由一个或多个用于描述DLL属性的模块语句组成的文本文件,每个.DEF文件至少必须包含以下模块定义语句:
第一个语句必须是LIBRARY语句,指出DLL的名字。
EXPORTS 语句列出被导出函数的名字。
可以使用DESCRIPTION语句描述DLL的用途(此句可选)。
格式如下:
EXPORTS HanL @1
3.函数原型声明文件(.h文件为例)
以以下格式写入:
#ifdef _cplusplus
extern"c"
{
#endif //_cplusplus
double WINAPI sub( double a ,double b ,double c ); //函数原型
#ifdef _cplusplus
}
#endif //_cplusplus
注意:
(1) c语言中须在调用函数前面声明或定义该函数,调用才能成功。在c中,函数原型通常和函数定义很相似,只不过原型以分号结尾。在c中原型仅仅用于类型检验。
(2) 建立函数原型:.h文件。.h文件可包含c或c++模块中,正如能从ifdef 看出的一样,若代码在c文件中,则不使用extern“c”语句,但作为一个c++文件进行编译,则需要使用。
(3)使用CPP文件(C++),则须防止C++引起的过多的名称修饰,为避免C++的名称修改,可使用extern“c”定义。extern”c”是C程序提供外部连接的方式,在C++代码中提供Visual Basic程序的链接,须使用extern”c”链接声明,这样定义的文件就可以使得其函数能被Visual Basic访问
4.2.2创建oil.dll
1.创建oil.dll的工程,启动VC++6.0按以下步骤生成DLL工程:
在菜单中选择File\New\Project
在工程列表中选择Win32 Dynamic-Link Library
在Project Name中输入工程名: oil
单击Location右边按钮,选择 “F:\李帆设计”目录
单击OK完成,至此已创建了oil.dll的工程文件
2.创建oil.def文件
在菜单中选择File\New\Text File。输入以下代码后保存文件名"oil.def" //指出DLL的名字oil,链接器将这个名字放到DLL导入库中
LIBRARY oil //定义导出函数suanfa()为例
EXPORTS HanL @1
3.创建oil.h
在菜单中选择File\New\C++ Head File项
输入代码后保存文件名" oil.h"
4.填写oil.cpp文件,输入代码后保存文件名“oil.cpp”。
5.编译DLL文件 ---- 从Build菜单中选择Build oil.DLL,产生oil.DLL文件,以后就可以调用了。

热点内容
五子棋对战算法 发布:2025-02-09 10:12:19 浏览:712
php树菜单 发布:2025-02-09 10:04:10 浏览:359
linux保存ip 发布:2025-02-09 10:04:10 浏览:23
四川霜狼服务器怎么样 发布:2025-02-09 10:02:44 浏览:145
Vs中h编译选项是灰的 发布:2025-02-09 10:01:59 浏览:557
安卓43怎么升级44 发布:2025-02-09 09:51:33 浏览:463
美国云服务器快还是香港快 发布:2025-02-09 09:34:33 浏览:988
怎么解压qq文件 发布:2025-02-09 09:18:14 浏览:581
安卓最新怎么调灵敏度更稳 发布:2025-02-09 09:12:44 浏览:400
豌豆荚如何用安卓手机下载 发布:2025-02-09 09:11:57 浏览:213