c++中的一段代码
结构
typedef struct _RES_STR
{
    DWORD dwID;        // 物品固定ID
    DWORD dwPos;      // 物品在商店的位置(格数)
    DWORD dwNum;    // 购买的数量
} RES_STR, PRES_STR;函数调用
__declspec(naked) void __stdcall Buy(DWORD dwNum, PRES_STR pRes)
{
    __asm
    {
        pushad
        push pRes
        push dwNum
        mov  eax, 0x594BE0
        call eax
        add  esp, 8
        popad
    }
}
我这样写成delphiprocedure TFrm_Pop.Button10Click(Sender: TObject);
type
RES_STR =packed record
dwID: DWORD ;
dwPos: DWORD ;
dwNum: DWORD ;
end;
var
Res:^RES_STR;      ←←注意,如果把^去掉则无法编译成功
dwNum:Integer;
begin
Res.dwID:=1726;
Res.dwPos:=2;
Res.dwNum:=2;
dwNum:=1;
asm
  pushad
  push Res
  push dwNum
  mov  eax,$594BE0
  call eax
  add  esp, 8
  popad
end;end;
可以编译成功,但是在运行调用的时候却会出错(已经注入游戏了,而c++是正确的),请问是代码写错了还是什么原因

解决方案 »

  1.   

    Res:^RES_STR;
    是个指针了,你没有实际内容
    type
    pRES_STR = ^RES_STR;
    var
    Res:pRES_STR;
    res := new(pRES_STR);
    再试试
      

  2.   

    var
    Res:^RES_STR;      ←←注意,如果把^去掉则无法编译成功
    dwNum:Integer;
    begin
    Res.dwID:=1726;
    Res.dwPos:=2;
    Res.dwNum:=2;
    dwNum:=1;你定义为指针类型,就应该为他分配内存啊
    GetMem(Res,SizeOf(Res));
    try
    Res.dwID:=1726;
    Res.dwPos:=2;
    Res.dwNum:=2;
    dwNum:=1;
    ...finally
      Freemem(Res);
    end;
      

  3.   

    楼上两位说到点子上了,我忽略了主要问题,呵呵。另外提一下delphi中
    RES_STR =packed record
    dwID: DWORD ;
    dwPos: DWORD ;
    dwNum: DWORD ;
    end;相当于c++中
    #pragma pack(push, 1)
    typedef struct _RES_STR
    {
    DWORD dwID; // 物品固定ID
    DWORD dwPos; // 物品在商店的位置(格数)
    DWORD dwNum; // 购买的数量
    } RES_STR, *PRES_STR;不过这个结构体凑巧8字节对齐和1字节对齐的大小相同program Project1;{$APPTYPE CONSOLE}uses
      SysUtils;type
      PRES_STR = ^RES_STR;
      RES_STR = packed record
        dwID: cardinal;
        dwPos: cardinal;
        dwNum: cardinal;
      end;procedure Foo(dwNum: Integer; Res: PRES_STR); stdcall;
    begin
      WriteLn(Res^.dwID);
      WriteLn(Res^.dwPos);
      WriteLn(Res^.dwNum);
      WriteLn(dwNum);
    end;var
      Res: PRES_STR;
      dwNum: Integer;
      Addr: Integer;
    begin
      New(Res);
      Res.dwID:=1726;
      Res.dwPos:=2;
      Res.dwNum:=2;
      dwNum:=1;
      Addr:=Integer(@Foo);
      asm
        pushad
        push Res
        push dwNum
        mov eax, Addr
        call eax
        add esp, 8
        popad
      end;
      Dispose(Res);
      ReadLn;
    end.