こんばんは。
GetMem(), FreeMem() を追加して文字数に応じたメモリを確保する必要があるようです。どうでしょうか。
var
hd_file: string;
fname: PChar;
begin
hd_file := 'c:\hamlog\hamlog.hdb';
GetMem(fname, length(hd_file) + 1);
StrPCopy(fname, hd_file);
sd := HamlogOpen(nil, Th, fname, 0);
FreeMem(fname);
end;