Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 125

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Вопрос заключается вот в чем.
Нужно скопировать файл в каталог System32 на ОС - Windows 7(64-битная).
С помощью функции GetSystemDirectory находим каталог и вызываем функцию CopyFile для копирования файла.
Вот вроде бы и все, запускаем программу от имени Администратора, все проходит успешно, но файл копируется не в папку по адресу C:\Windows\System32\ , а в папку по адресу C:\Windows\SysWOW64\ .
Можно как-нибудь это исправить ???

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. {{code}}
  2. var
  3. Form1: TForm1;
  4. SysPath : String;
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.FormCreate(Sender: TObject);
  10. var
  11. SysDir:PAnsiChar;
  12. Res:Integer;
  13. begin
  14.  
  15.  
  16.  
  17. SysPath := SysDir;
  18.  
  19. end;
  20.  
  21. procedure TForm1.Button1Click(Sender: TObject);
  22. const
  23. f : String = 'test.exe';
  24. var
  25. s: String;
  26. begin
  27. s := SysPath+'\'+f;
  28. if CopyFile(PChar(f),PChar(s), True) then
  29.  
  30. else
  31.  
  32. end;
  33.  
  34. end.
  35.  
  36. {{/code}}


Kyran29 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Kyran29 (статус: Посетитель)
Вопрос отправлен: 25 марта 2011, 21:55
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 15; последнее сообщение — 3 апреля 2011, 00:40; участников в обсуждении: 5.
DNK

DNK (статус: Студент), 25 марта 2011, 22:33 [#1]:

Kyran29: Забуть в W7 скопировать что-либо в системные папки. Там мелкомягкие что-то сильно намудрили.
"Digital Networked Knight"
Kyran29

Kyran29 (статус: Посетитель), 25 марта 2011, 22:56 [#2]:

DNK: Что, все так тяжело ??? Ни уж-то вообще доступ закрыт. Может есть какой вариант !
Если все ручками делать без программы все проходит и файл копируется нормально.
Kyran29

Kyran29 (статус: Посетитель), 26 марта 2011, 11:54 [#3]:

Уважаемые
эксперты! Я так думаю, ответов больше не будит??? Можно вопрос закрывать ?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 марта 2011, 15:08 [#4]:

а с чего Вы решили, что GetSystemDirectory должна вернуть обязательно "C:\Windows\System32" ?
Вадим К

Вадим К (статус: Академик), 26 марта 2011, 15:51 [#5]:

поддерживаю. Для 64 битной винды каталог с именем system42 - скорее всего рудимент.
Поэтому берите функцию, которая возвратит Вам C:\Windows и добавьте просто system32. Либо расскажите, зачем туда копируете файлы.
Галочка "подтверждения прочтения" - вселенское зло.
bugmenot

bugmenot (статус: 3-ий класс), 26 марта 2011, 19:13 [#6]:

Поддерживаю, какать в /bin - некошерно. А не туда может из-за а) виртуализации UAC б) исполнения в 32битной подсистеме.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Мережников Андрей

Мережников Андрей (статус: Абитуриент), 31 марта 2011, 21:07 [#7]:

Цитата (Вадим К):

поддерживаю. Для 64 битной винды каталог с именем system42 - скорее всего рудимент

и не только в 64-битной. Мало ли как можно обозвать каталог, в который установлена операционка?
Вадим К

Вадим К (статус: Академик), 31 марта 2011, 22:43 [#8]:

Цитата (Мережников Андрей):

Мало ли как можно обозвать каталог, в который установлена операционка?

Не совсем. Этот каталог (system32) жестко прописан во многих местах.
А в Висте, из за некоторых ошибок, пришлось даже делать, что бы системных диском всегда был диск С.
Галочка "подтверждения прочтения" - вселенское зло.
Kyran29

Kyran29 (статус: Посетитель), 1 апреля 2011, 16:03 [#9]:

Ну ладно пусть каталог \System32\ рудимент но адрес то у этого каталога должен быть. Вопрос в том что копируем файл сюда - C:\Windows\System32\ , а оказывается он здесь - C:\Windows\SysWOW64\ Почему ??? В чем проблема ???
Вадим К

Вадим К (статус: Академик), 1 апреля 2011, 16:12 [#10]:

Проблема в следующем
- у Вас 64битная система, а делфи делает 32 битные приложения.
- Вы не до конца понимает, как работают 32битные приложения в 64битной среде.
- туда лучше ничего не копировать. В свой паспорт человек же сам не вписывает ничего.
Галочка "подтверждения прочтения" - вселенское зло.
Kyran29

Kyran29 (статус: Посетитель), 1 апреля 2011, 20:03 [#11]:

Вадим К:
Я с Вами согласен туда луче ни чего не копировать для этого существуют специальные каталоги. Вопрос возник случайно, как-то попробовал скопировать файл в каталог System32 и получил выше изложенный результат. И теперь этот вопрос не дает мне покоя. Вроде каталог есть, найти его мы можем, а файл туда не копируется.
Выше Вы предлагали воспользоваться функцией, которая возвратит C:\Windows и просто добавить system32 – пробовал ситуация та же. Даже если просто указать путь ‘C:\Windows\System32\’ через строковую переменную результат не меняется.
Вот функция GetSpecialPath возвращает путь до каталога System32 и путь до каталога SysWOW64 но после копирования файла по первому адресу файл оказывается во втором каталоге.

uses ShlObj;
 
function GetSpecialPath(CSIDL: word): string;
var s:  string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true)
then s := '';
result := PChar(s);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := GetSpecialPath($25); // C:\Windows\System32
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 Label2.Caption := GetSpecialPath($29); // C:\Windows\SysWOW64
end;

Вы говорите – что я не до конца понимаю, как работают 32битные приложения в 64битной среде. Может быть. Я для этого и обратился за помощью на форум. Я не прошу писать мне код я прошу объяснить мне, почему так происходит или хотя бы дайте ссылку для «самопонимания» «энтого не дающему мне покоя» вопроса. За ранние большое спасибо.
DNK

DNK (статус: Студент), 1 апреля 2011, 21:57 [#12]:

Kyran29:

Цитата:

Вопрос в том что копируем файл сюда - C:\Windows\System32\ , а оказывается он здесь - C:\Windows\SysWOW64\
Суть копирования: Мы создаём файл в новом месте, но с тем же именем. Затем в новый файл записывается точная копия данных из исходного файла. Для создания файла, мы в конечном счете обращаемся к некоей функции ядра, одним из параметров которой является путь к файлу. Так неужели этой функции так сложно заменить в пути к файлу (строке то бишь) System32 на SysWOW64. На вопрос как это может быть, я думаю был убедительным.

Цитата:

Почему ???
А вот это отдельный вопрос. Думаю, на это были какаие-то свои причины у разработчиков семёрки.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 1 апреля 2011, 23:31 [#13]:

Здесь http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx сказка от Майкрософта, почему они сделали так ( я нахожу их доводы крайне неубедительными). И ещё немного тут http://forums.winamp.com/showthread.php?t=237297
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 2 апреля 2011, 15:11 [#14]:

Цитата (Вадим К):

Не совсем. Этот каталог (system32) жестко прописан во многих местах

я имел в виду, что каталог Windows может называться и Windows и Win и еще много различных способов его назвать. Висту не использую принципиально
Kyran29

Kyran29 (статус: Посетитель), 3 апреля 2011, 00:40 [#15]:

Вадим К:
Проблема решена. Я считаю, на свой вопрос получил полный ответ.
Готов поставить оценку за Ваш ответ. Большое спасибо.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 мая 2023, 07:23
Выполнено за 0.02 сек.
Рейтинг@Mail.ru