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()。
分享到:
相关推荐
3. **构造函数调用**:正如描述中提到,首先需要调用DLL中的类构造函数来创建对象实例。由于VC的构造函数通常是隐式调用的,但在Delphi中需要显式调用。这通常通过传递一个指针到类的私有数据结构(如`ECX`寄存器)...
在Windows系统中,`ws2_32.dll`是一个重要的动态链接库,它包含了用于网络编程的函数,如`send()`和`recv()`。这些函数是Windows Socket API(Winsock)的一部分,允许开发者进行TCP/IP通信。在这个话题中,我们主要...
3.以加载时动态链接方式调用DLL 4.以运行时动态链接方式调用DLL 5.以模块定义方式(.def文件)建立的动态链接库的调用 遇到的问题: 1.库导入的时候目录的问题。对应文中的问题1,后面有解释。 2.字符集的问题(是...
1. oraociei12.dll:Oracle Call Interface Enhancements,这是Oracle的增强接口,用于支持更高级的功能,如PL/SQL调用、游标等。 2. oraocci12.dll:Oracle Call Interface,是Oracle数据库的C++接口,允许C++...
.NET Core项目中的SAP RFC(Remote Function Call)调用涉及到了多个关键组件和技术,这些组件协同工作以使得.NET Core应用程序能够与SAP系统进行通信。本文将深入探讨这些必要的组件和实现过程。 首先,让我们了解...
Dispatch workbook = Dispatch.call(workbooks, "Open", "C:\\path\\to\\your\\file.xlsx").toDispatch(); // 更多操作... } } ``` 四、Jacob的工作原理 Jacob的工作原理基于JNI(Java Native Interface),这...
在易语言中,我们需要先使用`LoadLibraryA`加载DLL,然后用`GetProcAddress`获取函数地址,最后通过`CALL`调用。 4. **LoadLibraryA**:这是Windows API中的一个函数,用于在运行时加载动态链接库。它返回一个句柄...
首先,你需要下载Jacob的库文件,其中包括两个动态链接库(DLLs):jacob-1.17-x64.dll和jacob-1.17-x86.dll,分别对应64位和32位的Java环境。根据你的Java运行时环境选择合适的版本。将DLL文件放置在系统路径(如...