生成、使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。
1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目:
2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。
3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。
注意,这一步是必须的,否则写出来的DLL将需要在有VC2008的环境上才能运行。
4. 关注自动生成的文件MyDllTest.cpp,其中有几个实例,可以将他们删除,也可以不管他们。
5. 添加自己的接口,如:GetMyDllVersion
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
MYDLLTEST_API UINT32
GetMyDllVerion(
VOID
)
-
{
-
return
1234;
-
}
6. 在头文件MyDllTest.h中添加声明
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
MYDLLTEST_API
UINT32
GetMyDllVerion(
VOID
);
7. 添加导出符号定义文件,理论上是可以不要导出定义的,但是那样的结果就是生成的DLL中的符号名字不明确,只有定义了导出符号,才可以使得DLL中的借口函数名称得以确定。(关于def与dll 请参阅msdn
)
文件内容:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
LIBRARY
"MyDllTest"
-
EXPORTS
-
GetMyDllVerion
8. 在项目属性中设置模块定义文件为刚才建立的symexport.def文件:
9. 生成,可以得到一个MyDllTest.dll,使用Depends工具(VC6.0自带)可以查看这个DLL中包含了多少接口以及接口名:
会发现除了我们定义的借口GetMyDllVersion外还有几个??开头的接口,他们就是那些没有在模块定义文件中定义的借口自动生成的。
10. 除了DLL外我们还会发现生成了MyDllTest.lib文件,这个lib文件可以在其他的程序使用这个DLL的时候将其连接进去,同时只要包含MyDllTest.h即可调用这个DLL中的借口了。
如何引入dll
方法一.装载期间动态加载。(需要lib和dll)
1。新建Win32应用程序空项目。
2。把生成的dll、lib这2个文件复制到新建的目录下。
3。添加导入库:工具--项目和解决方案(vs里是options)--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。
4。头文件:
MyDllTest.h(与编写DLL中一样)
5。源文件:main.c
可注释#pragma comment(lib,"
MyDllTest.lib")这条,但必须设置链接库,方法:
右击项目--属性--配置属性--链接器--输入--附加依赖项:
MyDllTest.lib
-
-
#include "
MyDllTest.h"
-
#include "
windows.h"
-
#pragma comment(lib,"
MyDllTest.lib")
-
-
int
WINAPI WinMain(__in
HINSTANCE
hInstance, __in_opt
HINSTANCE
hPrevInstance, __in_opt
LPSTR
lpCmdLine, __in
int
nShowCmd )
-
{
-
-
-
GetMyDllVersion();
-
return
0;
-
}
方法二:运行期间动态加载。(只需Dll文件即可)
需要使用
Windows API
函数:
LoadLibrary
、
GetProcAddress
以及
FreeLibrary
#include <iostream>
#include <windows.h>
using namespace std;
//定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main()
{
FunctionFunc _FunctionFunc;
//加载目标Dll
HMODULE hModule = ::LoadLibrary
(TEXT("D:\MyDllTest.dll"));
if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{
::FreeLibrary(hModule);
}
//取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress
(hModule,"GetMyDllVersion");
if (_FunctionFunc==NULL)
{
::FreeLibrary
(hModule);
}
int a =_FunctionFunc();
cout<< a<<endl;
::FreeLibrary(hModule);
cin.get();
return 1;
}
有时候我们拿到的是别人的DLL和头文件,但是却没有LIB文件,这时就要使用另外的方法调用DLL中的接口了,例如MD5接口的使用:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
typedef
struct
-
{
-
ULONG
i[2];
-
ULONG
buf[4];
-
unsigned char
in[64];
-
unsigned char
digest[16];
-
} MD5_CTX;
-
typedef
void
(CALLBACK* MD5Init_Tpye)(MD5_CTX* context);
-
typedef
void
(CALLBACK* MD5Update_Tpye)(MD5_CTX* context,
-
unsigned char
* input,
-
unsigned int
inlen);
-
typedef
void
(CALLBACK* MD5Final_Tpye)(MD5_CTX* context);
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
HINSTANCE
hDLL;
-
-
hDLL = LoadLibrary(TEXT("Cryptdll.dll"
));
-
-
MD5Init_Tpye MD5Init;
-
MD5Update_Tpye MD5Update;
-
MD5Final_Tpye MD5Final;
-
-
-
MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init"
);
-
MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update"
);
-
MD5Final = (MD5Final_Tpye)GetProcAddress(hDLL, "MD5Final"
);
-
-
if
(!MD5Init || !MD5Update || !MD5Final)
-
{
-
-
FreeLibrary(hDLL);
-
return
;
-
}
-
-
MD5_CTX md5_context;
-
MD5Init(&md5_context);
-
MD5Update(&md5_context, src, length);
-
MD5Final(&md5_context);
-
-
-
FreeLibrary(hDLL);
这就是目前我知道的两种使用DLL的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。
- 大小: 33.1 KB
- 大小: 95.1 KB
- 大小: 56.8 KB
- 大小: 72 KB
- 大小: 99.7 KB
- 大小: 78.8 KB
分享到:
相关推荐
总的来说,"VC6调试卡死补丁dm.dll TLLOC.DLL"是一个针对性的解决方案,旨在帮助用户在Windows 10系统上继续使用VC6进行开发和调试,而不受卡死和无响应问题的困扰。通过理解补丁的作用和可能的原因,开发者可以更...
本教程将详细介绍如何使用Microsoft Visual C++ 6.0(简称VC6.0)来创建DLL文件,并展示如何在Visual Basic(VB)中调用这些DLL中的函数。 首先,创建DLL文件的过程分为以下几个步骤: 1. **创建新工程**:在VC6.0...
本主题将深入探讨“vc2008动态链接库使用(视频) 隐式导入dll”这一主题。 隐式导入是将DLL的功能直接集成到可执行文件中的一种方式。在隐式导入时,开发者需要通过以下步骤来实现: 1. **定义接口**:首先,你...
### VC安装排错SHSQL.DLL EESWT.DLL NMSQL.DLL 在进行VC++6.0 English Professional版本的安装过程中,可能会遇到与SHSQL.DLL、EESWT.DLL以及NMSQL.DLL这三个DLL文件相关的错误。本文将详细介绍这些问题的原因以及...
在使用Visual Studio 2008 (VS2008) 开发VC++控制台应用程序时,有时会遇到一个常见的问题:程序运行时提示“没有找到msvcr90d.dll”的错误,而且应用程序窗口会瞬间关闭,即“闪一下就没了”。这个错误通常与动态...
这个支持库包含了运行时环境、动态链接库(DLLs)和其他必要的组件,使得在没有安装完整版Visual Studio 2008的计算机上也能正常执行由VC2008编译的程序。 **一、运行时环境** VC2008支持库的核心部分是C++运行时...
为了方便部署,可以使用Microsoft的红石(Redistributable)包,这些包包含了所有必要的运行时组件,允许用户在没有安装完整Visual Studio的情况下运行程序。 在开发过程中,为避免依赖问题,开发者可以选择静态...
2014年完全版的VC运行库集成了自2014年前的所有版本,确保了对各种老程序的支持,特别是那些依赖早期版本库的软件。 **1. Visual C++简介** Visual C++是微软开发的一款集成开发环境,用于编写使用C++语言的应用...
【VC2008运行库】是微软Visual C++ 2008编译器所生成应用程序必须依赖的运行环境,它包含了运行许多基于VC++ 2008开发的软件所必需的动态链接库(DLL)文件。这些库文件提供了如C++标准库、MFC(Microsoft ...
1. **添加引用**:在新的或者现有的项目中,需要使用这个库,首先需要在"项目" -> "设置" -> "链接"选项卡下的"输入"部分,添加刚才生成的LIB文件的完整路径。 2. **包含头文件**:在需要使用库的源文件中,通过`#...
### VC如何调用DLL文件 #### 一、概述 动态链接库(Dynamic Link Library,简称DLL)是微软公司在Microsoft Windows操作系统中实现共享函数库概念的一种实作方式。这些库函数和数据可以由多个程序共享使用,而且在...
标题中的“常用软件运行库 v1.5 集VC2005库和VC2008库等运行库”是指一个包含了多种常用软件运行所必需的动态链接库(DLL)的集合,主要涵盖了微软Visual C++ 2005(VC2005)和Visual C++ 2008(VC2008)的运行时库...
这个安装程序主要是用来部署Visual C++的运行时库,使得用户能够在没有完整Visual Studio环境的计算机上运行由VC++编译的软件。 首先,我们来了解一下"msvcr100.dll"。这是微软Visual C++ 2010运行时库的一部分,...
teighafileconverter_qt5_vc10dll包,可使用它进行CAD文件格式转换,支持CAD版本ASCII和二进制两种,版本支持R9、R10、R12、R13、R14、2000、2004、2007、 2010、2013、2018等版本的dwg与dxf直接互相转换,转换后的...
"未安装VC时运行debug版所需dll"这个主题涉及到的是,在没有安装Visual C++(VC)开发环境的情况下,尝试运行编译为调试版本(Debug版)的程序可能遇到的问题。 Visual C++是一个用于开发Windows应用程序的集成开发...
这个“完美版hostlink协议dll 3.2版VB、VC、delphi使用例程和软件手册”包含了在不同编程环境下,如Visual Basic(VB)、Visual C++(VC)和Delphi中使用Hostlink协议进行开发所需的所有资源。 首先,让我们深入...
至于压缩包内只有一个文件"boost_date_time-vc100-mt-1_49.dll",这通常意味着用户可能需要这个特定的DLL来解决某些程序的依赖问题,或者为了在不安装完整Boost库的情况下使用日期时间功能。如果用户遇到“找不到...
本教程将详细介绍如何使用VC6.0创建一个DLL文件,并演示如何在VB(Visual Basic)中调用该DLL的函数。 首先,我们创建DLL项目。在VC6.0中,通过“文件”菜单选择“新建”,然后在“工程”选项中选择“Win32 Dynamic...
在描述中提到的“VC90动态库vc++2008中所需要的dll免安装”指的是一个集合,其中包含了这些必要的库文件,用户可以直接下载并放置到系统中,以便于运行依赖这些库的程序,而无需完整安装Visual C++ 2008。...