c++动态库封装及调用(VS2015)

c++动态库封装及调用(3、windows下动态库调用)

1.DLL的隐式调用

隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下: 
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件testdll.h所在的目录 
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件testdll.lib所在的目录 
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“testdll.lib”(若有多个 lib 则以空格隔开) 。 //你也可以在代码中添加一行设置库的链接,#pragma comment(lib, "DLLSample.lib")

 

库文件头文件等目录设置,本文将库文件及头文件拷贝到工程目录下DLL文件夹下

添加LIB依赖项

 #调用的源程序#

// callmyDLL.cpp : 定义控制台应用程序的入口点。  
//包含头头文件,函数声明    
  
#include "stdafx.h"  
#include "stdlib.h"  
#include "myDLL.h"  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
  //这是通过上节的extern方式调用的
    int z= Add(1,2);  
  
  //也可以通过类导出的方式调用
  //CmyDll dll;
  //int z = dll.Add(1,2);

    printf("z is:%d\n", z);  
    system("pause");  
    return 0;  
}  

以上如果包含目录、库目录、库的依赖项都没有问题就可以生成成功了

运行时最后一步:将动态库文件拷贝到可执行文件目录下,否则会出现如下错误。

 

如何没有设置lib目录和依赖项,可以在代码中添加以下一行代码也可以生成成功

// callmyDLL.cpp : 定义控制台应用程序的入口点。  
//包含头头文件,函数声明    
  
#include "stdafx.h"  
#include "stdlib.h"  
#include "myDLL.h"  
#prama comment(lib, "myDll.lib")  
//此时的myDll.lib的路径必须能找到的,可以给定一个全路径如:“c:\\myDll.lib”

int _tmain(int argc, _TCHAR* argv[])  
{  
    int z= Add(1,2);  
    printf("z is:%d\n", z);  
    system("pause");  
    return 0;  
}  

所以通过设置依赖项和库目录和添加#Prama是具有相同效果的,如果有问题,得检查是否两者的生成平台不同(如win32和x64)或者一个是Debug一个是release

 

2、DLL显示调用

对于显示连接,即动态加载我们需要调用LoadLibrary
在MSDN中:HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);
它的功能是映射一个可执行模块到调用进程的地址空间。由此我们知道显示调用就是函数指针来调用函数。

Steps:
1、声明头文件<windows.h>,说明我想用windows32方法来加载和卸载DLL
2、然后用typedef定义一个指针函数类型.typedef  void(*fun) //这个指针类型,要和你调用的函数类型和参数保持一致
3、定一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll;
格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,
因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
4、取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。
5、定义一个函数指针,用来获取你要用的函数地址。
  然后通过GetProcAdress来获取函数的地址,参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"sum");
  这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。
6、然后通过函数指针来调用函数。
7、调用结束后,就释放句柄FreeLibrary(hdll);

直接上代码,一一一一一目了然

 

// callDLLSee.cpp : 定义控制台应用程序的入口点。  
//通过调用windowsAPI 来加载和卸载DLL  
#include "stdafx.h"  
#include "Windows.h"  
typedef int(*Dllfun)(int , int);  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    Dllfun funName;  
    HINSTANCE hdll;  
    //put DLL under the Debug path   
    //use   _T 设置为宽字符  
    hdll = LoadLibrary( _T("myDLL.dll"));  
    if (hdll == NULL)  
    {  
        FreeLibrary(hdll);  
    }  
    funName = (Dllfun)GetProcAddress(hdll, "Add");  
    if (funName == NULL)  
    {  
        FreeLibrary(hdll);  
    }  
    int x = 1, y = 10;  
    double z= funName(r, h);  
    printf("z= %d\n", z);  
  
    FreeLibrary(hdll);  
    return 0;  
} 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2015中,加载静态库是一种使用C语言开发的方法,用于将预编译的函数和数据添加到程序中。下面是加载静态库的步骤: 首先,确保我们有一个已经编译好的静态库文件(通常以.lib为后缀),这个库文件中包含了一组函数和数据。 然后,我们创建一个C语言项目(可以选择控制台应用程序或者其他类型),在项目中包含静态库文件。可以通过在VS2015中的项目属性中进行设置。具体步骤如下: 1.打开项目属性对话框(右键单击项目->属性)。 2.选择“配置属性”->“链接器”->“常规”。 3.在“附加库目录”中添加静态库文件所在的路径。 4.在“输入”->“附加依赖项”中添加静态库文件名。 接下来,在代码中使用静态库中的函数和数据。可以通过包含头文件和调用相应的函数来实现。具体步骤如下: 1.在源码中包含库的头文件(通常以.h为后缀)。 2.通过调用库中的函数来使用其中的功能和数据。 最后,通过构建和运行项目,我们就可以使用静态库中的功能了。 加载静态库的好处是可以将常用的功能模块封装成库,方便在多个项目中复用代码,并且静态库会在编译时被链接到程序中,使得程序具备了相应功能,不需要像动态库那样在运行时加载。 总结起来,加载静态库可以通过在项目属性中设置库文件路径和库文件名,并通过调用库中的函数来使用其中的功能。这种方法可以提高代码的复用性和可维护性,同时在编译时将库链接到程序中,方便部署和分发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值