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++是正确的),请问是代码写错了还是什么原因
结构
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++是正确的),请问是代码写错了还是什么原因
是个指针了,你没有实际内容
type
pRES_STR = ^RES_STR;
var
Res:pRES_STR;
res := new(pRES_STR);
再试试
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;
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.