gpt4 book ai didi

c - 动态共享库加载框架

转载 作者:太空狗 更新时间:2023-10-29 11:34:54 24 4
gpt4 key购买 nike

我正在使用一个遗留的 C 库,它可以通过编写用户定义的函数进行扩展,然后重新编译源代码。我想避免编译要求,而是用一个函数扩展它一次(见下面的伪代码):

这个函数会这样实现:

VARIANT_TYPE CallSharedLibFunction(const char* library_name, const char* funcname, const char *params, const char* return_type){
// parse arguments and get data types and count
// initiate variable of data type indicated by return_type, to hold returned variable

/* this is the part I need help with */
// lptr = LoadSharedLibrary(library_name);
// funcptr = GetFunctionAddress(lptr, funcname);

// call function and pass it arguments
retvalue = funcptr(param1, param2, param3);

// wrap up returned value in the VARIANT_TYPE
VARIANT_TYPE ret;
setVariantValue(ret, retvalue, return_type);

return ret;

}

注意:尽管有“Windows 听起来”的名称(VARIANT_TYPE、LoadSharedLibrary 和 GetFunctionAddress),但我是在 Linux (Ubuntu 9.10) 上开发的。理想情况下,我希望库加载实现是跨平台的(因为我使用的是 ANSI C 代码)。但如果我必须选择一个平台,那将是 Linux 平台。

如果有人能阐明我如何在任意共享库中调用函数(理想情况下,以跨平台方式 - 否则,在 Linux 上),以便我可以实现上述功能,我将不胜感激。

最佳答案

您可能想看看 dlopen , dlsym 和类似的功能。这些在 POSIX(linux、OSX、win32+cygwin 等...)上工作。

使用 dlopen(),您可以打开一个共享库。您的 LoadSharedLibrary 可以是 dlopen() 的包装器。 GetFuncPtr() 函数可以是 dlsym() 的包装器。您可以做的是围绕 dl*() 函数编写代码以使其健壮——比如进行一些错误检查。您可能还想在共享库中定义一个接口(interface),即“导出”支持功能的结构。这样您就可以获得方法列表,而无需求助于读取 elf 文件。

还有a nice page about function pointers in C and C++ .

这是一个关于用法的简单示例:

void* LoadSharedLibrary(const char* name)
{
return dlopen(name, RTLD_LOCAL | RTLD_LAZY);
}

void* GetFunctionAddress(void* h, const char* name)
{
return dlsym(h, name);
}

const char** GetFunctionList(void* h)
{
return (char**)dlsym(h, "ExportedFunctions");
}

// Declare a variable to hold the function pointer we are going to retrieve.
// This function returns nothing (first void) and takes no parameters (second void).
// The * means we want a pointer to a function.
void (*doStuff)(void);

// Here we retrieve the function pointer from the dl.
doStuff = GetFunctionAddress(h, "doStuff");

// And this how we call it. It is a convention to call function pointers like this.
// But you can read it as 'take contents of the doStuff var and call that function'.
(*doStuff)();

关于c - 动态共享库加载框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com