为什么这个代码在运行时会崩溃?

时间:2016-08-08 00:23:32

标签: visual-c++ crash dllimport dllexport xbox360

我正在为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);

我不明白为什么这行代码会导致我的程序崩溃。任何答案/建议表示赞赏。谢谢!

0 个答案:

没有答案