2015-04-12 62 views
1

我在stackoverflow中找到下一個函數代碼。 當我嘗試將諸如'C:\ teste.zip'之類的文件轉換爲URL格式時,結果字符串包含額外的尾部#0字符。我的結果是''file:/// C:/teste.zip#0' 我做錯了什麼? 在此先感謝路易斯在delphi中使用UrlCreateFromPath XE7

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; 
+0

您需要再次做''SetLength(緩衝區,緩衝區大小)。 –

+1

對不起,這是['我的錯'](http://stackoverflow.com/a/8497976/960757)。它寫得非常糟糕。我還不確定引用是否包含拼寫錯誤,並且希望提及'pszUrl'而不是'pszPath'(最多應該是'MAX_PATH'長)的最大長度'INTERNET_MAX_URL_LENGTH'。 – TLama

+0

謝謝,它解決了我的問題。我只是再次添加SetLength(Buffer,BufferSize)。 –

回答

1

您正在以錯誤的方式計算預期的BufferSize。根據MS documentation,最大預期長度爲INTERNET_MAX_URL_LENGTH。轉換路徑地址是

正確代碼:

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; 
+0

嗨,你的代碼也返回正確的結果,它更簡單。謝謝 –

+0

您的緩衝區大小已關閉。你告訴API它比實際更小。 –

+0

我編輯了答案以糾正Rob指出的錯誤。錯誤是良性的,但這種方式更清楚。 –

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; 

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

也許如果您發佈完整的代碼,你是如何調用該函數...

+0

嗨,在XE7中,如果我使用上面的代碼,FilePathToURL的結果包含一個額外的#0字符。我在Richedit控件中使用以下內容刺激結果字符串:RichEdit.SelText:= FilePathToURL('c:\ test.zip')+'received;但是t被截斷,因爲FilePathToURL('c:\ test.zip')在結果上返回一個額外的結尾#0字符。 –

相關問題