2010-05-06 2 views
6

Почему этот код получает ошибку доступа на строке результата: = Буфер в D2010, но не D7?Почему этот код не работает в D2010, но не D7?

Что-то, я бы предположил, используя UniCode, но компилятор не генерирует никаких предупреждений.

Любые предложения по элегантному обходному решению?

Редактировать: Ouch: вызов GetTempPath обрушивает стек, о чем свидетельствует тот факт, что расширение Extension пустое после строки GetTempPath, но не раньше ... 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"? Typo для «расширения»? –

ответ

14

GetTempPath ожидает количество символов в буфере для его первого аргумента, а не размер в байтах. Измените SizeOf на Length и он будет работать.

+6

Да, и он работал в D7, потому что для AnsiStrings один символ - один байт. –

5

Чтобы заставить его работать как в D7, заменить «строка» с «AnsiString» и «Чаре» с «AnsiChar». Кроме того, вызовите GetTempPathA и GetTempFileNameA, а не GetTempPath и GetTempFileName.

Но подход, данный Мейсоном, вероятно, лучше, поскольку он будет поддерживать имена файлов Unicode.

+0

Предположительно вы имеете в виду «заставить его работать в ** D2010 **, заменить ...», так как он работает в D7? Также String и AnsiString одинаковы в Delphi 7, поэтому это не будет иметь никакого эффекта ... – DaveBoltman

+0

@DaveBoltman: Нет. Я пишу «Чтобы он работал ** как ** в D7, замените ...». –

+0

Ах да извините - я не читал ваш ответ осторожно :) Вы правы – DaveBoltman

Смежные вопросы