![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AV после вызова GetTempFileNameW
Псб © (2015-01-16 19:09:00)Здравствуйте. В неюникодных версиях Delphi этот код работает нормально, а в Delphi XE7 вызывает AV:
procedure TForm1.Button1Click(Sender: TObject);
var
szTempPath, szTmpFile: array[0..MAX_PATH] of Char;
begin
if GetTempPath(SizeOf(szTempPath), szTempPath) > 0 then
begin
ShowMessage(szTempPath);
if GetTempFileName(szTempPath, '~', 0, szTmpFile) > 0 then
ShowMessage(szTmpFile);
// после происходит AV и программа завершается с ошибкой
end;
end;
Что я делаю не так?
MBo (2015-01-16 21:24:00) [1]
> Я так понял юникодная версия функции требует строго константу
> в качестве размера буфера, а ANSI без разницы?
Не в константе дело - размер указывается в символах, а не в байтах.
из MSDN:
GetTempPath
nBufferLength [in]
The size of the string buffer identified by lpBuffer, in TCHARs.
Псб (2015-01-16 20:23:00) [2]Вопрос снимается SizeOf(Char) = 2
Т.е можно и так написать:
if GetTempPath(SizeOf(szTempPath) div 2, szTempPath) > 0 then
Псб (2015-01-16 20:06:00) [3]
> MBo © (16.01.15 19:38) [1]
>
> if GetTempPath(MAX_PATH, ...
Спасибо. Так работает.
Попробовал сделать так:
procedure TForm1.Button1Click(Sender: TObject);
const
a = 100;
var
szTempPath, szTmpFile: array[0..a-1] of Char;
begin
if GetTempPath(a, szTempPath) > 0 then
begin
//ShowMessage(szTempPath);
if GetTempFileName(szTempPath, '~', 0, szTmpFile) > 0 then
ShowMessage(szTmpFile);
end;
end;
Я так понял юникодная версия функции требует строго константу в качестве размера буфера, а ANSI без разницы?
Извиняюсь за назойливость, просто впервые с этим столкнулся :)
MBo (2015-01-16 19:38:00) [4]if GetTempPath(MAX_PATH, ...