Delphi Tips 
-----------------------------

0149  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/11 osamu 編集
可変長レコードの扱い方

> 今、DirectPlayの送信部分を制作していますが、
>
> HRESULT Send(DPID idFrom, DPID idTo, DWORD dwFlags,
>              LPVOID lpData, DWORD dwDataSize);
>
> 上記のようになっていて、送信データ部分を構造体のポインタで渡す
> ようになっています。現在は、
>
>  TTextMessage = record
>    dwType: DWORD;  {  dwType は絶対に必要  }
>    Msg   :array[0..255]of char;
>  end;

>
> としてstring型からchar型に変換してから送受信をしていますが、
> 255文字以上送信できませんし、短い場合は無駄が生じるように思います。
> このmsgの部分を可変サイズにする方法はないでしょうか?

必要な量だけヒープから確保するのがよろしいかと思います。
具体的な案としては、以下のような手順が考えられます。
  1. 送信用に AllocMem等で 必要量だけ確保
  2. 確保した領域を編集しやすいように 予め用意しておいた型をかぶせ、編集
  3. 送信
  4. 確保領域の開放

例)
const
  Giga = (1024*1024*1024);
type
  // 編集用の型
  PTextMessage = ^TTextMessage;
  TTextMessage = record
    dwType: DWORD;
    Msg:    array[0..1*Giga -1] of Char;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  pBuf: Pointer;
  pMsg: PTextMessage;
begin
  pBuf := AllocMem(Sizeof(pMsg^.dwType) + 4092);

  // 型をかぶせて編集
  pMsg := pBuf;
  with pMsg^ do
  begin
    dwType := $12345678;
    StrCopy(Msg, PChar(StringOfChar('A', 4091)));
  end;
  
  ... // 送信等

  FreeMem(pBuf);
end;
参照: [Delphi-ML:25091] <PASCAL> <メモリ>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp