简单的说我通过共享内存文件与vc++程序交换数据
这个buff的值是vc++给到内存中的
我去读的时候,总无法读第1个字节的内容
我知道第1个char的指针在buff[0]前面
可是我读不到它的值

解决方案 »

  1.   

    array[0..512]of char实际是513个字节、
    它的前面有没有其他数据,有否考虑字节对齐?
      

  2.   

    array[0..512]of char实际是513个字节、是从零开始的~~
      

  3.   

    type
      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,(错误) 
      

  4.   

    typedef struct _SOCKET_ARMOR_DATA //注意:这是8个字节对齐方式
    {
        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,(错误) 
      

  5.   

    简单的说:
    我能不能读位于内存
    char a[0];
    a 前面的2个char
    就是a[-2]
      

  6.   

    我觉得应该可以
    你可以用取绝对地址ABSOLUTE试试
    先定义一个指针
    然后取字串绝对地址
    减2后试试???
      

  7.   

    有没有例子呀?
    我还没test过指针
      

  8.   

    var p:pointer;
    p:=absolute(a);
    p:=p-2;
    i:=p^;
    试试
      

  9.   

    var
      p: pointer;
      I: char;
    begin
          p := absolute(psocketarmordata.buff[0]);
          p := p - 2;
          i := p^;
    end;
    提示缺少操作符,我看帮助上说应该这样用:
    var  Str: string[32];
      StrLen: Byte absolute Str;
      

  10.   

    SORRY
    我没有细看帮助
    这个东东一般也用得少
    你还可以试试@地址符
      

  11.   

      p:[email protected][0];
      p:=p-1;
      i:=p^;
    提示P:=p-1 操作符错误
      

  12.   

    好象不能减两个字节,除非是,BYTE
      

  13.   

    啊,faint
    integer类型能不能读它前2个字节的integer数据?
      

  14.   

    其实让char向左移动1个byte就可以
    我的定义正好是8字节
    或者让integer向左移动,然后再读
      

  15.   


    看来总不用指针不行了
    你直接p:=@str
    showmessage(string(p^))看是否是你想要的结果??
      

  16.   

    跨语言处理记录/结构数据时,要用紧凑格式:在Delhi中:
      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;
      

  17.   

    老鱼
      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;
      

  18.   

    不是addr: SOCKADDR_IN;有影响呢?‘SOCKADDR_IN到底是什么类型?定义为string就错了
    你把两边都去掉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));
     
      

  19.   

    c里面的record是8字节对起方式
    delphi好象是2字节不知道delphi能不能8字节对起record
      

  20.   

    你把
    szProcessName写满512各字节看是否还正确    
      

  21.   

    真搞不懂,读integer数据都错
    读char数据都能读到,只是buff少了2字节
      

  22.   

    to newjy 
    我们的数据来自内存
    我测试过各种声明的组合,调试了3天
    结果都是buff少的字节更多
    有时候它会少6个字节