필자는 Windows 용 코드를 가지고 있으며, 지금은 리눅스로 포팅을 시도하고있다. 그러나 가능한지 확실하지 않다.exe 안에있는 함수를 어떻게 콜백합니까? (리눅스)
내 질문 : 공유 라이브러리에서 실행 파일에있는 함수에 콜백하려고합니다. 어떻게해야합니까?
저는 리눅스에서 매우 익숙한 편입니다. 제 질문이 너무 저평 많은 경우 저에게 알려주십시오. 내 실행 가능하도록 "ioq3ded.ppc64을"생각하는 이유, 즉
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 +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<windows.h>
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);
}
나는 포트에 리눅스 코드를 시도,하지만 난 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
}
}
ioq3ded.ppc64는 라이브러리입니까? – dicaprio
'dlerror'는 오류에 대한 자세한 정보를 제공합니다. 'fprintf (fp, "% d", 1);''fprintf (fp, "% s", dlerror());'를 시도하고 파일을 검사하십시오. 이미 duskwuff이 응답으로 언급했듯이,'dlopen'은 실행 파일에서 작동하지 않습니다. –
나는 fprintf를 시도했다. (fp, "% s", dlerror()); Now :] 수신 된 신호 11, 종료 중 ... ----- Server Shutdown (신호 잡김) ----- – user598208