Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.10;
Скачать: CL | DM;

Вниз

Не понятная ситуация с копированием файла   Найти похожие ветки 

 
Coming   (2009-03-25 09:36) [0]

Здравствуйте,
помогите пожалуйста разобраться, вот кусочек кода:
 //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;

так все работает, но если разкаментить первую строку - возникает эксес виолейшн...
Почему так происходит подскажите пожалуйста.


 
Немо ©   (2009-03-25 09:39) [1]

а если только ее и оставить :)
ведь тоже будет AV?


 
clickmaker ©   (2009-03-25 09:39) [2]

сильно подозреваю, что память под w_dir не выделяется


 
Юрий Зотов ©   (2009-03-25 09:39) [3]

Похоже, не выделена память под w_dir.


 
Сергей М. ©   (2009-03-25 09:41) [4]

Проблема в w_dir - либо мусор, либо память не выделена, либо размер выделенной памяти < 30 байт


 
Coming   (2009-03-25 09:42) [5]

Вы правы.
Только вот если добавить:
 GetWindowsDirectory(w_dir,100);
 ShowMessage(w_dir);

все работает:)


 
Palladin ©   (2009-03-25 09:42) [6]

ну раз никто еще этого не подсказал, наверное память под w_dir не выделена :)


 
Palladin ©   (2009-03-25 09:43) [7]


> все работает:)

ну по встречке тоже можно иногда ездить... недолго правда...


 
Coming   (2009-03-25 09:44) [8]

Как ее правильно выделить в таком случае?


 
Palladin ©   (2009-03-25 09:45) [9]

То есть, ты уже как-то выделяешь, но думаешь, что как-то не правильно?


 
Coming   (2009-03-25 09:47) [10]

как бы в орешник не попасть)))

GetWindowsDirectory(w_dir,100); - разве тут не выделяется 100 байт под возвращаемую строку?


 
Юрий Зотов ©   (2009-03-25 09:47) [11]

> Coming   (25.03.09 09:44) [8]

> Как ее правильно выделить в таком случае?

GetMem(...);
try
 ...
finally
 FreeMem(...);
end;


 
Coming   (2009-03-25 09:49) [12]

И еще совершенно непостежимо для моего ума почему если добавить снизу ShowMessage(w_dir); - никаких ошибок не возникает...


 
Palladin ©   (2009-03-25 09:49) [13]


> Coming   (25.03.09 09:47) [10]

Нет конечно. За, редкостным исключением, API функции не выделяют память.


 
Немо ©   (2009-03-25 09:50) [14]

GetMem(w_dir, MAX_PATH + 1);
GetWindowsDirectory(w_dir, MAX_PATH);
FreeMem(w_dir);


> Проблема в w_dir - либо мусор, либо память не выделена,
> либо размер выделенной памяти < 30 байт

читал, что 100 с чем-то.. как узнать почему 30?


 
Юрий Зотов ©   (2009-03-25 09:50) [15]

> Coming   (25.03.09 09:47) [10]

Нет, здесь ничего не выделяется. Здесь функции GetWindowsDirectory передаются:
- указатель на якобы выделенный блок памяти;
- размер этого якобы выделенного блока.


 
Palladin ©   (2009-03-25 09:51) [16]


> непостежимо

не стегай свой ум ) он пока еще этого не заслуживает, в силу своей адекватности


 
Coming   (2009-03-25 09:53) [17]

Большое всем спасибо за помощь:)


 
brother ©   (2009-03-25 11:36) [18]

> //GetWindowsDirectory(w_dir,30);

всегда писал: GetWindowsDirectory(w_dir,255);


 
Anatoly Podgoretsky ©   (2009-03-25 13:22) [19]

> brother  (25.03.2009 11:36:18)  [18]

И w_dir наверно w_dir: array [0..255] of char;


 
brother ©   (2009-03-25 13:29) [20]

> И w_dir наверно w_dir: array [0..255] of char;

нет, просто думал что данного буфера должно хватить всегда...


 
Anatoly Podgoretsky ©   (2009-03-25 14:55) [21]

> brother  (25.03.2009 13:29:20)  [20]

Хватит, но не надолго, плохо кончится.


 
brother ©   (2009-03-25 14:57) [22]

> Хватит, но не надолго, плохо кончится.

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


 
Anatoly Podgoretsky ©   (2009-03-25 15:09) [23]

> brother  (25.03.2009 14:57:22)  [22]

Потому что переменная всего четыре байта размером, значит придется занимать от соседних.


 
brother ©   (2009-03-26 05:20) [24]

> Потому что переменная всего четыре байта размером, значит
> придется занимать от соседних.

не понял, о чем речь?


 
Palladin ©   (2009-03-26 07:48) [25]


> brother ©   (26.03.09 05:20) [24]

Анатоль пошутил. )


 
brother ©   (2009-03-26 07:48) [26]

а)


 
Немо ©   (2009-03-26 13:24) [27]


> не понял, о чем речь?

считает данные соседних участков памяти


 
Anatoly Podgoretsky ©   (2009-03-26 13:36) [28]

> brother  (26.03.2009 7:48:26)  [26]

Серьезен как никогда.


 
Anatoly Podgoretsky ©   (2009-03-26 13:37) [29]

> Немо  (26.03.2009 13:24:27)  [27]

Экспропреирует.



Страницы: 1 вся ветка

Текущий архив: 2009.05.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
10-1155886244
Alvin
2006-08-18 11:30
2009.05.10
Защита документа Word


4-1196974392
Koss
2007-12-06 23:53
2009.05.10
программно отключить включить usb port


2-1238143029
igorntk
2009-03-27 11:37
2009.05.10
Поиск в БД


2-1238400479
SP
2009-03-30 12:07
2009.05.10
Иерархическая таблица. Как лучше реализовать?


2-1238429766
SuperPROgrammist
2009-03-30 20:16
2009.05.10
Не могу вывести битмап с прозр. цветом.