linux 回调,如何回调exe中的函数? (linux)

我有一个用于Windows的书面代码,现在我试图移植到Linux,但不知道它是否可行。如何回调exe中的函数? (linux)

我的问题:我试图从共享库中的可执行文件中回调函数。我怎么做?

我对Linux很新,所以如果我的问题太低级,请和我一起袒护。

这是编译输出:

Output:

build/release-linux-ppc64/ioq3ded.ppc64

build/release-linux-ppc64/ioquake3.ppc64

build/release-linux-ppc64/baseq3/cgameppc64.so

build/release-linux-ppc64/baseq3/qagameppc64.so

build/release-linux-ppc64/baseq3/uippc64.so

build/release-linux-ppc64/missionpack/cgameppc64.so

build/release-linux-ppc64/missionpack/qagameppc64.so

build/release-linux-ppc64/missionpack/uippc64.so

make[2]: Entering directory `/r/home7/XXX/ioquake3'

make[2]: `build/release-linux-ppc64/ioq3ded.ppc64' is up to date.

make[2]: `build/release-linux-ppc64/ioquake3.ppc64' is up to date.

LD build/release-linux-ppc64/baseq3/cgameppc64.so

LD build/release-linux-ppc64/baseq3/qagameppc64.so

LD build/release-linux-ppc64/baseq3/uippc64.so

LD build/release-linux-ppc64/missionpack/cgameppc64.so

LD build/release-linux-ppc64/missionpack/qagameppc64.so

LD build/release-linux-ppc64/missionpack/uippc64.so

这是我跑来执行我的程序的命令,这就是为什么我想通“ioq3ded.ppc64”是我的可执行文件。

./ioq3ded.ppc64 +set fs_game Mod +set sv_pure 0 +set vm_game 0 +set vm_cgame 0 +set vm_ui 0 +set dedicated 1 +exec something_117.cfg

这是代码为Windows:

//Called function

__declspec(dllexport) void UnLinkLinkroutingcache(void)

{

//code

}

//Callback location

#include

typedef void (* fUnLinkLinkroutingcache_t)(void);

void fUnLinkLinkroutingcache(fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache)

{

pUnLinkLinkroutingcache(); return;

}

fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache;

void callUnlinkLink(void)

{

HMODULE hLib;

//fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache;

hLib = LoadLibrary(TEXT("ioquake3.exe"));

if (hLib == NULL)

{

//Module not found, permission denied, ...

return 0; //inform caller of error

}

pUnLinkLinkroutingcache = (fUnLinkLinkroutingcache_t)GetProcAddress(hLib, TEXT("UnLinkLinkroutingcache"));

if (pUnLinkLinkroutingcache == NULL)

{

return 0;

}

fUnLinkLinkroutingcache(pUnLinkLinkroutingcache);

}

我试图端口的代码到Linux,但我似乎无法加载exe文件。

//Called function

extern void UnLinkLinkroutingcache(void)

//Callback location

void callUnlinkLink(void)

{

void* handle;

void (*initializer)(void);

FILE *fp;//zgzg2020

fp = fopen("HereIsMe.txt", "a");

if(fp != NULL)

{

fprintf(fp, "%d", 1);

fprintf(fp, "\n");

}

fclose(fp);

handle = dlopen("./ioq3ded.ppc64", RTLD_LAZY);

if(handle == NULL) {

// report error ...

fp = fopen("ICantFindFile.txt", "a");

if(fp != NULL)

{

fprintf(fp, "%d", 1);

fprintf(fp, "\n");

}

fclose(fp);

exit(1);return;

} else {

initializer = dlsym(handle,"UnLinkLinkroutingcache");

if(initializer == NULL) {

// report error ...

fp = fopen("ICantFindFfunction.txt", "a");

if(fp != NULL)

{

fprintf(fp, "%d", 1);

fprintf(fp, "\n");

}

fclose(fp);

exit(1);return;

} else {

// cast initializer to its proper type and use

(*initializer)();

}

// use the result in a call to dlsym

}

}

+0

ioq3ded.ppc64是一个库吗? –

2011-12-28 05:55:17

+2

'dlerror'会给你更多关于错误的信息。而不是'fprintf(fp,“%d”,1);'try'fprintf(fp,“%s”,dlerror());'并检查文件。正如duskwuff在回应中已经提到的那样,'dlopen'不适用于可执行文件。 –

2011-12-28 06:01:23

+0

我试过fprintf(fp,“%s”,dlerror());现在:]收到信号11,正在退出... -----服务器关闭(信号被捕获)----- –

2011-12-28 08:49:30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值