開発ブログ - WMDropFiles ではまる

WMDropFiles ではまる

カテゴリ : 
技術メモ » Delphi
執筆 : 
2014/10/30
教訓!
Win32API に文字列バッファを渡す時には AllocMem ではなく SetLength すること

久々に WMDropFiles を使ったプログラムを書いていました。
日本語名のファイルをドロップすると、なんだか変なことに...
いろいろ調べたところ AllocMem を使っていたために、日本語名が入っているとメモリ破壊が起きていたようです。
正しくはこんな感じ...

procedure TMainForm.WMDropFiles(var msg: TWMDROPFILES);
var
  Count: Integer;
  Len: Integer;
  Path: String;
begin
  try
    Count := DragQueryFile(msg.Drop, $ffffffff, nil, 0);
    if Count > 1 then begin
      ShowMessage('ひとつだけドロップしてください');
      Exit;
    end;

    Len := DragQueryFile(msg.Drop, 0, nil, 0) + 1;
    SetLength(Path, Len-1);
    DragQueryFile(msg.Drop, 0, PChar(Path), Len);
  finally
    DragFinish(msg.Drop);
  end;
end;



ネット上を調べてみると、新しい投稿などでも AllocMem しているケースが見受けられました。
以外に気が付かないものですよね...
  • コメント (0)
  • トラックバック (0)

コメントの投稿

お気軽にコメントください : 投稿されたコメントは承認後に表示されます
プロダクツ

開発ブログ

Link

AD