显式调用的动态链接库怎么回调?

老马何以识途 2008-03-26 02:16:33
我在写一些动态链接库,这些库文件实现相同的函数名和参数类型,主程序根据配置动态调用不同的库。而主程序调用库函数时,库函数需要调用主程序的函数实现某些功能,比如:

/**
**Filename: libabc.c
**动态链接库
*/
int StrLen(char *pStr)
{
int iLen = 0;
printMsg(pStr);
...
return iLen;
}


/**
**Filename: main.c
**主程序
*/
void printMsg(char *msg)
{
printf("Message: %s\n", msg);
return;
}

int main(int argc, char* argv)
{
char* str = "Hello world!";
int i = StrLen(str);
return 0;
}


在隐式调用中,回调完全没问题,但是因为有不同的库文件实现相同名字的函数,只能显式调用,这时候该如何回调呢?期待高人指点!
...全文
164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老马何以识途 2008-03-28
  • 打赏
  • 举报
回复
5楼可算正解,虽然我要做的接口中是另一个函数传递指针,原理是一样的。
老马何以识途 2008-03-27
  • 打赏
  • 举报
回复
不好意思,麻烦各位了,原来规范还定义了传递函数指针的函数,只是不在实现具体功能的函数中传递指针。
不过还是很好奇文档中提到的一段话,也许是我理解还有偏差,原文是:
To determine whether an IMV function is defined, a TNC Server will pass the function name to dlsym. If the result is NULL, the function is not defined. Otherwise, the function is defined and the TNCS can call it using the function pointer returned. This is common practice on UNIX and Linux.
A similar mechanism is used to allow an IMV to determine whether a TNCS function is defined. In fact, this mechanism is the only way that the IMV can call a TNCS function with this platform binding.
老马何以识途 2008-03-27
  • 打赏
  • 举报
回复
谢谢楼上的,但是规范定义的接口是没有函数指针这个参数的,我感到头大就是这个问题了。
mymtom 2008-03-27
  • 打赏
  • 举报
回复
看错题目:
加个参数就可以了嘛:

/*
* file: main.c
* by: mymtom
*/

#include <dlfcn.h>
#include <stdio.h>

static void
main_hello(void)
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
}

static void
main_hello2(void)
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
}

int
main(void)
{
void *h;
void *h2;
void (*f)(void (*pf)(void));
void (*f2)(void (*pf)(void));

h = dlopen("./libmlib.so", 0);
h2 = dlopen("./libmlib2.so", 0);
f = (void(*)(void(*)(void)))dlsym(h, "hello");
f2 = (void(*)(void(*)(void)))dlsym(h2, "hello");
f(main_hello);
f2(main_hello2);
dlclose(h);
dlclose(h2);
}


/*
* file: mlib.c
* by: mymtom
*/

#include <stdio.h>

void
hello(void (*pf)(void))
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
pf();
}


/*
* file: mlib2.c
* by: mymtom
*/

#include <stdio.h>

void
hello(void (*pf)(void))
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
pf();
}

[code=BatchFile]
#! /bin/sh
cc -c -fPIC mlib.c
cc -c -fPIC mlib2.c
cc -shared -o libmlib.so mlib.o
cc -shared -o libmlib2.so mlib2.o
cc -c main.c
cc -o main main.o
./main
[/code]
mymtom@freebsd$ chmod +x build.sh
mymtom@freebsd$ ./build.sh
mlib.c:hello
main.c:main_hello
mlib2.c:hello
main.c:main_hello2
mymtom 2008-03-27
  • 打赏
  • 举报
回复
用函数指针给个简单例子.

/*
* file: main.c
* by: mymtom
*/

#include <dlfcn.h>

int
main(void)
{
void *h;
void *h2;
void (*f)(void);
void (*f2)(void);

h = dlopen("./libmlib.so", 0);
h2 = dlopen("./libmlib2.so", 0);
f = (void(*)(void))dlsym(h, "hello");
f2 = (void(*)(void))dlsym(h2, "hello");
f();
f2();
dlclose(h);
dlclose(h2);
return (0);
}


/*
* file: mlib.c
* by: mymtom
*/

#include <stdio.h>

void
hello(void)
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
}


/*
* file: mlib2.c
* by: mymtom
*/

#include <stdio.h>

void
hello(void)
{
printf("%s:%s\n", __FILE__, __FUNCTION__);
}

$ cc -shared -o libmlib.so mlib.o
$ cc -shared -o libmlib2.so mlib2.o
$ cc -c -fPIC mlib.c
$ cc -c -fPIC mlib2.c
$ cc -shared -o libmlib.so mlib.o
$ cc -shared -o libmlib2.so mlib2.o
$ cc -c main.c
$ cc -o main main.o
$ ./main
mlib.c:hello
mlib2.c:hello
老马何以识途 2008-03-26
  • 打赏
  • 举报
回复
动态链接库有编写规范,库函数参数没有可以传入回调函数指针的地方,有的话也就好办了。
dxing_1983 2008-03-26
  • 打赏
  • 举报
回复
帮顶
littlefirebug 2008-03-26
  • 打赏
  • 举报
回复
用函数指针?
我也不懂.

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧