我正在为xbox 360制作一个应用程序,它将导入从系统dll导出的函数,并在需要时调用它们。我认为我做了一切正确的导出然后导入函数,但它崩溃了一行代码。
我首先定义了系统dll中的函数,如下所示:
void (__cdecl *SV_GameSendServerCommand)(int Client, int Type, char *Command) = (void(__cdecl * )(int, int, char * ))0x82254940;
bool (__cdecl *Dvar_GetBool)(char *Dvar) = (bool(__cdecl * )(char * ))0x8229EF58;
我创建了一个.def文件来导出函数,同时分配它们的序数:
LIBRARY testdll
EXPORTS
SV_GameSendServerCommand @1
Dvar_GetBool @2
我构建了系统dll,并将生成的testdll.lib放在我的应用程序源代码所在的文件夹中。然后我将以下内容放在该应用程序的stdafx.h中:
#pragma comment(lib, "testdll.lib")
我将要导入的函数原型化,并使用一个名为resolveFunct的函数来获取导入函数的地址。
void (__cdecl *SV_GameSendServerCommand)(int Client, int Type, char *Command);
bool (__cdecl *Dvar_GetBool)(char *Dvar);
UINT32 resolveFunct(char* modname, UINT32 ord)
{
UINT32 ret=0, ptr2=0;
HANDLE ptr32 = 0;
ret = XexGetModuleHandle(modname, &ptr32);
if(ret == 0)
{
ret = XexGetProcedureAddress(ptr32, ord, &ptr2);
if(ptr2 != 0)
return ptr2;
}
return 0; // function not found
}
当我尝试打印函数的地址时,它成功并读取0x91F8BF54。我这样做了两次,它打印了两次。前一行代码导致我的应用程序崩溃。
DWORD WINAPI Start(LPVOID)
{
for(;;)
{
if(!LoadedUp)
{
printf("0x%p\n", resolveFunct("testdll.xex",2));
if(Dvar_GetBool == NULL)
{
printf("0x%p\n", resolveFunct("testdll.xex",2));
Dvar_GetBool = (bool(__cdecl*)(char*))resolveFunct("testdll.xex",2);
我不明白为什么这行代码会导致我的程序崩溃。任何答案/建议表示赞赏。谢谢!