![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не понятная ситуация с копированием файла
Coming © (2009-03-25 09:36:00)Здравствуйте,
помогите пожалуйста разобраться, вот кусочек кода:
//GetWindowsDirectory(w_dir,30);
if FileExists('c:\MyFile.exe') then
begin
ShowMessage('Exist');
end
else
begin
CopyFile(PChar(ParamStr(0)), PChar('c:\MyFile.exe'), True);
end;
так все работает, но если разкаментить первую строку - возникает эксес виолейшн...
Почему так происходит подскажите пожалуйста.
Anatoly Podgoretsky (2009-03-26 13:37:00) [1]> Немо (26.03.2009 13:24:27) [27]
Экспропреирует.
Anatoly Podgoretsky (2009-03-26 13:36:00) [2]> brother (26.03.2009 7:48:26) [26]
Серьезен как никогда.
Немо (2009-03-26 13:24:00) [3]
> не понял, о чем речь?
считает данные соседних участков памяти
brother (2009-03-26 07:48:00) [4]а)
Palladin (2009-03-26 07:48:00) [5]
> brother © (26.03.09 05:20) [24]
Анатоль пошутил. )
brother (2009-03-26 05:20:00) [6]> Потому что переменная всего четыре байта размером, значит
> придется занимать от соседних.
не понял, о чем речь?
Anatoly Podgoretsky (2009-03-25 15:09:00) [7]> brother (25.03.2009 14:57:22) [22]
Потому что переменная всего четыре байта размером, значит придется занимать от соседних.
brother (2009-03-25 14:57:00) [8]> Хватит, но не надолго, плохо кончится.
почему? полный путь врядли будет больше, имхо, не надо длинных имен папок и больших вложенностей...
Anatoly Podgoretsky (2009-03-25 14:55:00) [9]> brother (25.03.2009 13:29:20) [20]
Хватит, но не надолго, плохо кончится.
brother (2009-03-25 13:29:00) [10]> И w_dir наверно w_dir: array [0..255] of char;
нет, просто думал что данного буфера должно хватить всегда...
Anatoly Podgoretsky (2009-03-25 13:22:00) [11]> brother (25.03.2009 11:36:18) [18]
И w_dir наверно w_dir: array [0..255] of char;
brother (2009-03-25 11:36:00) [12]> //GetWindowsDirectory(w_dir,30);
всегда писал: GetWindowsDirectory(w_dir,255);
Coming (2009-03-25 09:53:00) [13]Большое всем спасибо за помощь:)
Palladin (2009-03-25 09:51:00) [14]
> непостежимо
не стегай свой ум ) он пока еще этого не заслуживает, в силу своей адекватности
Юрий Зотов (2009-03-25 09:50:00) [15]> Coming (25.03.09 09:47) [10]
Нет, здесь ничего не выделяется. Здесь функции GetWindowsDirectory передаются:
- указатель на якобы выделенный блок памяти;
- размер этого якобы выделенного блока.
Немо (2009-03-25 09:50:00) [16]GetMem(w_dir, MAX_PATH + 1);
GetWindowsDirectory(w_dir, MAX_PATH);
FreeMem(w_dir);
> Проблема в w_dir - либо мусор, либо память не выделена,
> либо размер выделенной памяти < 30 байт
читал, что 100 с чем-то.. как узнать почему 30?
Palladin (2009-03-25 09:49:00) [17]
> Coming (25.03.09 09:47) [10]
Нет конечно. За, редкостным исключением, API функции не выделяют память.
Coming (2009-03-25 09:49:00) [18]И еще совершенно непостежимо для моего ума почему если добавить снизу ShowMessage(w_dir); - никаких ошибок не возникает...
Юрий Зотов (2009-03-25 09:47:00) [19]> Coming (25.03.09 09:44) [8]
> Как ее правильно выделить в таком случае?
GetMem(...);
try
...
finally
FreeMem(...);
end;
Coming (2009-03-25 09:47:00) [20]как бы в орешник не попасть)))
GetWindowsDirectory(w_dir,100); - разве тут не выделяется 100 байт под возвращаемую строку?