在 delphi XE7 中使用 UrlCreateFromPath

Using UrlCreateFromPath in delphi XE7

我在Whosebug中找到了下一个函数代码。 当我尝试将诸如 'C:\teste.zip' 的文件转换为 URL 格式时,生成的字符串包含额外的尾随 #0 字符。我的结果是 ' 'file:///C:/teste.zip#0' 我究竟做错了什么? 提前致谢,路易斯

function FilePathToURL(const FilePath: string): string;
var
  Buffer: string;
  BufferSize: DWORD;
begin
  Result := '';
  BufferSize := Length('file:///' + FilePath + #0);
  SetLength(Buffer, BufferSize);

  if UrlCreateFromPath(PChar(FilePath), PChar(Buffer), @BufferSize, 0) = S_OK then
    Result := Buffer;
end;

代码看起来不错,我刚测试过:

function FilePathToURL(const FilePath: string): string;
var
  Buffer: string;
  BufferSize: DWORD;
begin
  Result := '';
  BufferSize := Length('file:///' + FilePath + #0);
  SetLength(Buffer, BufferSize);

  if UrlCreateFromPath(PChar(FilePath), PChar(Buffer), @BufferSize, 0) = S_OK then
    Result := Buffer;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Add(FilePathToURL(Edit1.Text));
end;

也许如果你 post 你的完整代码,你是如何调用函数的...

您计算预期 BufferSize 的方式有误。根据 MS documentation,最大预期长度为 INTERNET_MAX_URL_LENGTH

将 Path 转换为 Url 的正确代码是:

const
  INTERNET_MAX_URL_LENGTH = 2048 + 32 + 3;

function FilePathToURL(const FilePath: string): string;
var
  Buffer: array [0.. INTERNET_MAX_URL_LENGTH - 1] of Char;
  BufferSize: DWORD;
begin
  Result := '';
  BufferSize := INTERNET_MAX_URL_LENGTH;
  if UrlCreateFromPath(PChar(FilePath), @Buffer, @BufferSize, 0) = S_OK then
    Result := Buffer;
end;