開発ブログ - WMDropFiles ではまる
教訓!
Win32API に文字列バッファを渡す時には AllocMem ではなく SetLength すること
久々に WMDropFiles を使ったプログラムを書いていました。
日本語名のファイルをドロップすると、なんだか変なことに...
Win32API に文字列バッファを渡す時には AllocMem ではなく SetLength すること
久々に WMDropFiles を使ったプログラムを書いていました。
日本語名のファイルをドロップすると、なんだか変なことに...
いろいろ調べたところ AllocMem を使っていたために、日本語名が入っているとメモリ破壊が起きていたようです。
正しくはこんな感じ...
ネット上を調べてみると、新しい投稿などでも 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 しているケースが見受けられました。
以外に気が付かないものですよね...