可変長レコードの扱い方
|
> 今、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; |
|