首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

提问关于C++和delphi数据结构在ASM中的有关问题

2012-02-14 
提问关于C++和delphi数据结构在ASM中的问题c++中的一段代码结构typedefstruct_RES_STR{DWORDdwID//物品固

提问关于C++和delphi数据结构在ASM中的问题
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
        }
}


我这样写成delphi

procedure   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++是正确的),请问是代码写错了还是什么原因

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



[解决办法]
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;


[解决办法]
楼上两位说到点子上了,我忽略了主要问题,呵呵。

另外提一下

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.

热点排行