项目中有很多时候用到外部dll,调用的时候如果用静态调用,程序exe目录下有很多dll,看起来很乱,不利于后续维护;动态调用可以把dll放在想放的文件夹内,但是如果一个dll要用到的函数很多,动态调用就会很麻烦。采用可变参数模板类可以让动态调用变得像静态调用一样。

注:仅在支持C++11的IDE下使用。

//.h

#include<Windows.h>
#include<iostream>
#include <string>
#include <map>
#include <functional>
using namespace std;
class CDllParser
{
public:
CDllParser();
~CDllParser();
bool Load(const char* dllPath);
bool unLoad();
template <typename T>
std::function<T> getFunction(const char* funcName); template <typename T, typename... Args>
typename std::result_of<std::function<T>(Args...)>::type excecuteFunc(const char* funcName, Args&&... args); private:
HMODULE m_hMod;
std::map<string, FARPROC> m_map;
};
template <typename T>
std::function<T> CDllParser::getFunction(const char* funcName)
{
auto it = m_map.find(funcName);
if (it == m_map.end())
{
auto addr = GetProcAddress(m_hMod, funcName);
if (nullptr == addr)
return nullptr;
m_map.insert(std::make_pair(funcName, addr));
it = m_map.find(funcName);
}
return std::function<T>((T*)(it->second));
} template <typename T, typename... Args>
typename std::result_of<std::function<T>(Args...)>::type CDllParser::excecuteFunc(const char* funcName, Args&&... args)
{
auto f = getFunction<T>(funcName);
if (nullptr == f)
{
string s = "Can not find function ";
s.append(funcName);
throw std::exception(s.c_str());
}
return f(std::forward<Args>(args)...);
}
//.cpp
#include "StdAfx.h"
#include "CallDLL.h" CDllParser::CDllParser() :m_hMod(nullptr)
{ } CDllParser::~CDllParser()
{
unLoad();
} bool CDllParser::Load(const char* dllPath)
{
m_hMod = LoadLibrary(dllPath);
if (nullptr == m_hMod)
return false;
return true;
} bool CDllParser::unLoad()
{
if (nullptr == m_hMod) return true;
auto bFree = FreeLibrary(m_hMod);
if (!bFree)
return false;
m_hMod = nullptr;
return true;
}

参考:《深入应用C++11 代码优化与工程级应用》

dll帮助类的更多相关文章

  1. C#加载dll 创建类对象

    //加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...

  2. DLL导出类避免地狱问题的完美解决方案

    DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...

  3. DLL的概念、dll导出类(转贴)

    1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链 ...

  4. C++ DLL导出类 知识大全

    在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...

  5. c++11实现DLL帮助类

    用过DLL的人都会发现,在C++中调用dll中的函数有点繁琐,调用过程如下:在加载dll后还要定义一个对应的函数指针类型,接着调用GetProcAddress获取函数地址,再转成函数指针,最后调用函数 ...

  6. 通过反射获取DLL的类实现加载窗体

    1.创建一个DLL 类库,并新建一个窗体类,这个直接在vs上操作就好 2. 建立一个Testassembly工程 新建一个测试类 namespace Testassembly { public par ...

  7. DLL 导出类

    MyMathFun.h #pragma once // #ifdef DLLCLASS_API // #define DLLCLASS_API _declspec(dllimport) // #els ...

  8. cmake 静态调用 c++ dll 的类的一个例子(Clion IDE)[更新1:增加1.模版的应用,2.ma 的算法]

    CMakeLists.txt project(aaa) add_library(aaa SHARED aaa.cpp) add_executable(bbb bbb.cpp) target_link_ ...

  9. cmake 静态调用 c++ dll 的类的一个例子(Clion IDE)

    CMakeLists.txt project(aaa) add_library(aaa SHARED aaa.cpp) add_executable(bbb bbb.cpp) target_link_ ...

  10. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...

随机推荐

  1. Docker容器使用 (入门到精通)

    Docker容器 CentOS安装Docker Docker 分为 CE 和 EE 两大版本.CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月. D ...

  2. 二、typora软件的安装与markdown语法

    目录 一.typora软件的安装与使用 1.软件的安装 2.破解使用的方法 3.功能描述(markdown语法讲解) 标题 小标题 语言环境 表格 表情 图片 查看源代码 数学公式 流程图 高亮文本 ...

  3. 【安全】漏洞复现及修复——CVE-2023-24055 keepass触发器注入获取明文密码

    write by homelander 如要转载请注明出处谢谢:https://www.cnblogs.com/vitalemontea/p/17104168.html 1.前言 [仅供学习使用,切勿 ...

  4. Fiddler抓手机APP包

    *手机和电脑连接在同一wifi下 *fiddler设置 *启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开"Fiddler Options&qu ...

  5. LeetCode_单周赛_329

    2544. 交替数字和 代码1 转成字符串,逐个判断 class Solution { public int alternateDigitSum(int n) { char[] s = (" ...

  6. VMware 虚拟机安装 OpenWrt 作旁路由 单臂路由 img 镜像转 vmdk 旁路由无法上网 没网络

    重要注意事项 由于布线原因笔记本只能采用无线的方式连接路由器,在Windows10的环境下使用无线网卡桥接,结果软路由无法上网,翻阅了各种帖子最终发现跟系统底层的协议栈有关系,随即放弃使用有线网卡,不 ...

  7. Solon v2.1.4 发布。支持 java、kotlin、groovy!

    本次发布,重点测试和验证了在 java.kotlin.groovy 三种 jvm 语言里,开箱即用的特性.并发布 Solon Initializr: https://solon.noear.org/s ...

  8. 【KAWAKO】TVM-使用c++进行推理

    目录 前言 修改cpp_deploy.cc文件 修改DeployGraphExecutor()函数 numpy与bin文件的互相转换 numpy转bin bin转numpy 使用CMakeLists. ...

  9. PG统计信息和系统表

    一.PG统计信息概述 pg的统计信息主要分为两种: 第一类统计信息是是负载指标"统计信息"(Monitoring stats),通过stat collector进程进行实时采集更新 ...

  10. godis实战