简单的说我通过共享内存文件与vc++程序交换数据
这个buff的值是vc++给到内存中的
我去读的时候,总无法读第1个字节的内容
我知道第1个char的指针在buff[0]前面
可是我读不到它的值
这个buff的值是vc++给到内存中的
我去读的时候,总无法读第1个字节的内容
我知道第1个char的指针在buff[0]前面
可是我读不到它的值
解决方案 »
- 小问题002
- 如何让自己开发的程序具有短信收发功能??
- ADOQuery.FieldByName('aa').Value=Variable 'self' 是什么啊?
- 窗口最小化问题???
- 急急急急!!!!delphi程序看不懂,我是菜鸟。。。求高手讲解。。。
- 这样写SQL,怎么老是出错呀,在线等待,各位帮我看看
- 关于内存分配的问题,大虾请指点或讨论一下。大家请多多关注
- 请问如何在SQL语句中实现对 Binary 类型的位运算?
- 求助:这段代码请帮助改成Delhpi
- 我高兴我喜欢!(只给浪人哥哥)
- 如何让delphi 的record采用8字节对起方式?
- 30分求答,对你来说完全是个意外的惊喜,相信我没错的
它的前面有没有其他数据,有否考虑字节对齐?
TSocketArmorData = record
hSocketArmorWnd: HWND;
uMsg: uint;
uMsgAccept: uint;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1024-1] of Char;
len: Integer;
end;
var
pSocketArmorData: ^TSocketArmorData; hFileMapping := CreateFileMapping($FFFFFFFF, 0, PAGE_READWRITE,
0, SizeOf(TSocketArmorData), 'SocketArmorFileMapping');
if hFileMapping = 0 then exit;
pSocketArmorData := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
读szprocessname正确
读buff,总少前3个char
读nflags错误
读len总为0,(错误)
{
HWND hWnd;
UINT uMsg;
UINT uMsgAccept;
char szProcessName[MAX_PATH];
int nFlags;
SOCKADDR_IN addr;
char buff[64*1024];
int len;
} SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA;翻译为:
TSocketArmorData = record
hSocketArmorWnd: HWND;
uMsg: Cardinal;
uMsgAccept: Cardinal;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1023] of Char;
len: Integer;
end;
读szprocessname正确
读buff,总少前3个char
读nflags错误
读len总为0,(错误)
我能不能读位于内存
char a[0];
a 前面的2个char
就是a[-2]
你可以用取绝对地址ABSOLUTE试试
先定义一个指针
然后取字串绝对地址
减2后试试???
我还没test过指针
p:=absolute(a);
p:=p-2;
i:=p^;
试试
p: pointer;
I: char;
begin
p := absolute(psocketarmordata.buff[0]);
p := p - 2;
i := p^;
end;
提示缺少操作符,我看帮助上说应该这样用:
var Str: string[32];
StrLen: Byte absolute Str;
我没有细看帮助
这个东东一般也用得少
你还可以试试@地址符
p:=p-1;
i:=p^;
提示P:=p-1 操作符错误
integer类型能不能读它前2个字节的integer数据?
我的定义正好是8字节
或者让integer向左移动,然后再读
看来总不用指针不行了
你直接p:=@str
showmessage(string(p^))看是否是你想要的结果??
TSocketArmorData = packed record
hSocketArmorWnd: HWND;
uMsg: Cardinal;
uMsgAccept: Cardinal;
szProcessName: array[0..511] of Char;
nFlags: Integer;
addr: SOCKADDR_IN;
buff: array[0..64 * 1023] of Char;
len: Integer;
end;在VC++中:
#pragma pack( 1 ) // 变成一个字节对齐方式
typedef struct _SOCKET_ARMOR_DATA
{
HWND hWnd;
UINT uMsg;
UINT uMsgAccept;
char szProcessName[MAX_PATH];
int nFlags;
SOCKADDR_IN addr;
char buff[64*1024];
int len;
} SOCKET_ARMOR_DATA,*PSOCKET_ARMOR_DATA;
p:[email protected][0];
hexeditor1.lines.add(string(p^));
程序运行时候报错,说地址错误
我感觉它跟
hexeditor1.lines.add(psocketarmordata.buff)没什么区别
还是需要让char[0]的地址向左移动1个byte一定是这2行中比vc++多占8字节内存!
szProcessName: array[0..511] of Char;//szprocessname一般20个字,读头20字正确
nFlags: Integer;
你把两边都去掉addr试试
你的数据是存在文件中吗ms:Tmemorystream;
test:pSocketArmorData ;
buf:array [0..1000000000] of char;//>=sizeof (TSocketArmorData )ms:=tmemorystream.create;
ms.loadfromfile('...');
ms.read(buf,sizeof(TSocketArmorData));
copymemory(test,buf,sizeof(tsocketArmordata));
delphi好象是2字节不知道delphi能不能8字节对起record
szProcessName写满512各字节看是否还正确
读char数据都能读到,只是buff少了2字节
我们的数据来自内存
我测试过各种声明的组合,调试了3天
结果都是buff少的字节更多
有时候它会少6个字节