`
yesjavame
  • 浏览: 694750 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

dl_call()调用Dll/so

阅读更多

dl_call()调用Dll/so

(转载请注明来源于金庆的专栏)

dl_call()是StlSoft库中的功能。

dl_call()以一种自然的语法,调用动态链接库中的函数。Windows版本也能处理三种常见的函数调用约定:cdel、fastcall和stdcall。
dl_call()的第一个参数指定了函数所在的动态库。它必须是字符串(char const*,或任何定义了c_str_ptr字符串访问垫片的字符串类型),或者是已经装载的动态库的句柄(UNIX上是void*,Windows上是HINSTANCE)。第二个参数是库中动态函数的标识符。它可以选择性地添加一个调用约定分类符前缀,用冒号':'分隔。分类符有:"C"(或"cdecl")表示cdecl、"F"(或"fastcall")表示fastcall、和"S"(或"stdcall")表示stdcall。如果没有分类符,默认是cdecl。(cdecl是所有C/C++编译器默认的调用约定,除非用命令行标志明确指示使用其他调用约定。)
--摘自《Extended STL》中译( http://www.china-pub.com/209232 )

Linux下的so动态链接库可以用unixstl::dl_call().
unixstl::dl_call()和winstl::dl_call()实现不同,但两者的结构是相同的。
再封装一下做成跨平台的应该不难。

#include <winstl/dl/dl_call.hpp>
int main()
{
int n = winstl::dl_call<int>("foo.dll", "C:foo", 123);
return 0;
}


等同于以下调用:

#include <windows.h>
int main()
{
HINSTANCE h = ::LoadLibrary("foo.dll");
typedef int (__cdecl *LPFOO)(int);
LPFOO pFoo = (LPFOO)GetProcAddress(h, "foo");
int n = pFoo(123);
::FreeLibrary(h);
return 0;
}


使用dl_call()就不用显式地加载动态链接库,也不用列出函数原型。

加载库是很费时的,所以为了提高效率,多次调用应该只加载一次。

#include <winstl/dl/dl_call.hpp>
int main()
{
HINSTANCE h = ::LoadLibrary("FooDll.dll");

for (int i = 0; i < 10000000; i++)
winstl::dl_call<int>(h, "C:foo", 123);

::FreeLibrary(h);
return 0;
}


至少可以省去函数指针类型的定义和GetProcAddress()。

分享到:
评论

相关推荐

    cudart64_110.dll、cudart64_100.dll、cudart64_101.dll等文件

    标题中的“cudart64_110.dll、cudart64_100.dll、cudart64_101.dll”是一系列与NVIDIA CUDA Toolkit相关的动态链接库(DLL)文件,它们在CUDA编程环境中起着至关重要的作用。CUDA是一种由NVIDIA公司开发的并行计算...

    ASPADS.IN_, ASPNETOC.DL_,ASPPERF.DL_,ASP.DL_,ASP.MF_,ASP.MO_

    标题和描述中提到的文件名ASPADS.IN_, ASPNETOC.DL_, ASPPERF.DL_, ASP.DL_, ASP.MF_, ASP.MO_,这些看起来像是与微软的ASP(Active Server Pages)技术相关的一些组件或者更新文件。在Windows 2003 Server环境中,...

    cublas64_10.dll、cublas64_100.dll

    在IT领域,特别是深度学习和计算加速方面,`cublas64_10.dll`和`cublas64_100.dll`是两个非常重要的动态链接库(DLL)文件,它们属于NVIDIA的CUDA(Compute Unified Device Architecture)库的一部分。CUDA是一种...

    S-function-to-Simulink.zip_c编写s函数_simulink调用C_simulink调用dll_调用dl

    S-函数是System function 系统函数的简称,是指采用非图形化(即计算机语言,而非Simulink 系统模块)的方式描述的功能模块。在MATLAB 中,用户除了可以使用...动态连接库(DLL)文件,然后在Simulink 中直接调用

    Method_of_delphi_call_VC_class.zip_Delphi VC DLL_Delphi call DL

    本案例中的"Method_of_delphi_call_VC_class.zip"是一个关于Delphi如何调用VC(Visual C++)编写的DLL(动态链接库)中的类方法的示例。Delphi和VC都是流行的开发工具,Delphi以其快速的应用程序开发能力和面向对象...

    XInput1_4.dll下载 找不到XInput1_4.dll DLL文件丢失.zip

    dll控件常规安装方法(仅供参考): 一、如果在运行某软件或编译程序时提示缺少、找不到dll等类似提示,您可将下载来的dll拷贝到指定目录即可(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用...

    cudart64_100.dll 解决"dlerror: cudart64_100.dll not found"的问题

    解决"Could not load dynamic library 'cudart64_100.dll'; dlerror: cudart64_100.dll not found"的问题 下载后放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 目录下

    可用于foobar20000版本的DTS解码器插件foo_input_dts.dll

    标题提及的是“可用于foobar20000版本的DTS解码器插件foo_input_dts.dll”,这表明我们讨论的是一个针对音乐播放软件foobar2000的特定插件,该插件用于解码DTS编码的音频文件。DTS(Digital Theater Systems)是一种...

    opencv_videoio_ffmpeg.dll

    在您提供的信息中,我们关注的是与视频I/O(输入/输出)和FFmpeg相关的动态链接库(DLL)文件。FFmpeg是一个免费的软件项目,集成了音频和视频处理工具,包括解码、编码、转换、流和过滤等功能。 1. **OpenCV的...

    dl645.rar_4 3 2 1_DL645-2007 _dl645_dl645.c

    * 0 DT_ZXYGZ, // 正向有功总电能 * 1 DT_FL1ZXYG, // 费率1正向有功 * 2 DT_FL2ZXYG, // 费率2正向有功 * 3 DT_FL3ZXYG, // 费率3正向有功 * 4 DT_FL4ZXYG, // 费率4正向有功 ...

    php_mssql.dll

    php_mssql.dll 版本 5.2.8.8

    解决classification_dll.dll无法找的问题

    将下载的dll压缩包中的dll全部放到C盘的windows目录下就可以了 压缩包包含五个dll,只要全部放到windows目录下就好了 为解决以下异常: 运行时出错! 错误信息:无法找到指定DLL库文件“classification_dll.dll”...

    用于Tensorflow-gpu版本缺少的cublas64_11.dll等文件

    标题中提到的"用于Tensorflow-gpu版本缺少的cublas64_11.dll等文件",正是这个问题的体现。这些文件是NVIDIA CUDA计算平台的重要组成部分,对于运行GPU加速的TensorFlow程序至关重要。 1. **cublas64_11.dll**:这...

    libmysql_d.dll.126.rar

    标题中的“libmysql_d.dll.126.rar”是一个压缩包文件,其中包含了动态链接库文件libmysql_d.dll的特定版本126。这个文件在Windows操作系统中是MySQL数据库客户端连接器的一部分,用于应用程序与MySQL服务器进行通信...

    MarkEzd.rar_MarkEzd.dll_c# MarkEzd.dll_金橙子_金橙子 C#_金橙子C

    3. 调用API:通过实例化DLL中的类或直接调用静态方法,实现与DLL的交互。这需要了解“MarkEzd.dll”的函数原型和参数说明,通常可以从头文件或官方文档中获取。 4. 错误处理:在调用DLL函数时,应考虑到可能出现的...

    (易语言源码)ET99模拟FT_ET99_API.dll代码

    3. 调用约定:确保模拟函数的调用约定与原DLL一致,这是模拟成功的关键。 "精易模块 V3.0.ec"是易语言的一个扩展模块,包含了一些额外的库函数和组件,可以增强易语言的编程能力。这个模块可能提供了与硬件交互、...

    cusparse64_11.dll

    《tensorflow安装与cusparse64_11.dll详解》 在深入探讨TensorFlow与cusparse64_11.dll之间的关系之前,我们首先要理解这两个概念的基本含义。TensorFlow,一个由谷歌开发的强大开源库,主要用于数据流图计算,广泛...

    apache视频流插件mod_flvx.so mod_h264_streaming.so两个

    第一步,下载mod_flvx.so和mod_h264_streaming.so并放到apache目录下的modules文件夹下 mod_flvx.so mod_h264_streaming.so 把这两个文件放到,apache的modules目录中,然后查找httpd.conf这个文件,打开编辑,找到...

    chrome_elf.dll

    chrome_elf.dll,安装cuda_10.1.243_426.00_win10时候遇到了,无法写入,文件夹下的chrome_elf.dll拒绝访问,于是找到这个dll,复制到相应路径下,继续安装,问题得到解决。

    dl.rar_DLL VC DELPHI_delphi 加载DLL_dl.dll_dll_dll delphi

    dll文件的使用方法,包括动态 和静态加载dll文件

Global site tag (gtag.js) - Google Analytics