Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
4-1209159476
alexnmsk
2008-04-26 01:37
2009.05.10
Дозвон по модему


2-1238059763
ggg111
2009-03-26 12:29
2009.05.10
Массив байт в JPEG (картинка)


15-1236237557
{RASkov}
2009-03-05 10:19
2009.05.10
Когда драйвер "не нужен", а ОСь его требует


15-1236146985
SteepeWolf
2009-03-04 09:09
2009.05.10
Изменения оклада


2-1233876018
Alexei
2009-02-06 02:20
2009.05.10
Копирование с WebBrowser a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский