2010-05-06 48 views
6

Bu kod neden Sonuçta bir erişim hatası alıyor: D2010'da = Dizin satırında, D7 değil mi?Bu kod neden D2010'da başarısız oluyor, ancak D7'de başarısız oluyor?

Unutmayın ki bir şey, UniCode'u dahil etmeyi tahmin ediyorum, ancak derleyici herhangi bir uyarı üretmiyor.

Zarif bir çözüm hakkında öneriniz var mı?

Düzenleme: Hata: GetTempPath çağrısı, Uzantının GetTempPath satırından sonra boş olduğu gerçeğinin kanıtladığı gibi yığının çöp kutusuna yığılmasıdır ... Yikes.

function GetTempPathAndFileName(const Extension: string): string; 
    var 
     Buffer: array[0..MAX_PATH] of Char; 
    begin 
     repeat 
     GetTempPath(SizeOf(Buffer) - 1, Buffer); 
     GetTempFileName(Buffer, '~', 0, Buffer); 
     Result := Buffer; // <--- crashes on this line, 
     Result := ChangeFileExt(Result, Extension); 
     until not FileExists(Result); 
    end; { GetTempPathAndFileName } 
+0

"aExtension"? "Uzantı" için yazım hatası? –

cevap

14

GetTempPath, ilk argümanı için arabelleğin karakter sayısını, bayt cinsinden değil, boyutta beklemektedir. SizeOf'u Length olarak değiştirin ve işe yarayacaktır.

+6

Evet, ve D7'de işe yaradı, çünkü AnsiStrings için, bir karakter bir bayttır. –

5

o D7 olarak çalışmak "AnsiString" ve "ANSIChar" ile "Char" ile "dizesini" yerine yapmak. Ayrıca GetTempPath ve GetTempFileName yerine GetTempPathA ve GetTempFileNameA'yı da arayın.

Ancak Mason tarafından verilen yaklaşım muhtemelen daha iyi, çünkü Unicode dosya adlarını destekleyecektir.

+0

Muhtemelen D7'de çalıştığı için "D2010 ** 'da çalışmaya başlamak için ..." demek istediniz. Ayrıca String ve AnsiString, Delphi 7'de aynıdır, bu yüzden herhangi bir etkisi olmayacaktır ... – DaveBoltman

+0

@DaveBoltman: Hayır. "D7'de çalışmak ** için ** yapmak, yerine ..." yazarım. –

+0

Ah evet üzgünüm - Cevabını dikkatlice okumadım :) Sen haklısın – DaveBoltman

İlgili konular