Определение архитекуры процессора в OS Windows

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 18.07.2016 19:29:02

pupsik писал(а):Ответьте на такое: загрузит ли 32 битное приложение 32 битную и 64 битную длл? Т.е. простая загрузка, через стандартный loadlyb.... Без проверок. По идее должно.

Не загрузит, потому что 32-битным приложениям запрещено загружать 64-битные dll-ки.

pupsik писал(а):Ведь "морда-лица" формы и компонентов лазаря берутся из системных длл винды... Но мне интересно ваше мнение...

Морда-лица загружается из системных длл винды, для которых есть 32-битная версия.
Об этом очёнь чётко пишут сами мелгомягкие. Если ты счастливый обладатель Виндоус 64, то можешь смело идти в папку установленной винды (C:\Windows), и в ней найти папку SysWOW64. Внутри этой папки лежат все системные dll-ки (например kernel32.dll и user32.dll) которые исползьуются всеми 32-битными программами. В частности они содержат библиотеки морды-лица 32-битных приложения собранных на Лазарусе.

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

Пишем такой код, который ничего не делает, кроме попытки загрузить указанную dll-ку
Код: Выделить всё
program loadalib;
{$mode delphi}

uses
  Windows;
var
  lib: HINST;
  s  : string;
  err : LongWord;
begin
  {$ifdef cpu32}
  writeln('I AM 32-bit application!');
  {$endif}
  {$ifdef cpu64}
  writeln('I AM 64-bit application!');
  {$endif}

  if ParamCount=0 then begin
    writeln('please specify .dll to load');
    Exit;
  end;
  s:=ParamStr(1);
  writeln('Loading: ', s);
  lib:=LoadLibraryA(PChar(s));
  if lib=0 then  begin
    err:=GetLastError;
    writeln('ERROR: ',err);
    if err=ERROR_BAD_EXE_FORMAT then
      writeln('Bad format or platform is not supported!');
  end else
    writeln('Library loaded');
end.

Компилируем его с помощью FPC для любой архитетуры по вкусу. (я собрал, естественно для 32-битов, хотя сам сижу на 64-битной винде).

Теперь идём на сайт 7-zip и скачиваем там архив под описанием "7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager". Прямая ссылка.
Чем этот архивчик хорош?! тем, что в нём есть и 32х битная и 64х битная версия библиотеки 7zip-а.

Запускаем программу сначала для 32-битной версии длл-ки
Код: Выделить всё
loadalib.exe 7za.dll

Результат
Код: Выделить всё
I AM 32-bit application!
Loading: 7za.dll
Library loaded

Запускаем программу для 64-битной версии длл-ки
Код: Выделить всё
loadalib.exe x64\7za.dll

Результат
Код: Выделить всё
I AM 32-bit application!
Loading: x64\7za.dll
ERROR: 193
Bad format or platform is not supported!


Предлагаю всем желающим поиграться, и высказаться на тему этого проекта.

Так что имея такие результаты, мне очень интересно твоё "просто решение" с простой заменой одних длл-ок на другие.
Я прекрасно понимаю, что всё это было 5 лет назад и давно, и откуда .длл-ки ты копировал, ты уже не вспонишь.
Но вот "objdump", который я прошу запустить, уже не первый пост, тебе бы мог рассказать, что это за длл-ки такие - 32 или 64-х битные.
Заодним objdump можно натравить и на саму программу, и узнать 32 или 64 битная программа.

Ведь написать "objdump -f имяобъектного" файла, это же намного быстрее и короче, чем очередной пост, в котором будет излагаться, что я что-то опять каверкаю?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Определение архитекуры процессора в OS Windows

Сообщение pupsik » 18.07.2016 20:27:28

Я прекрасно понимаю, что всё это было 5 лет назад и давно, и откуда .длл-ки ты копировал, ты уже не вспонишь.
http://www.7-zip.org/...
Но вот "objdump", который я прошу запустить, уже не первый пост...
вопрос не в хочу, а в могу... На данный момент у меня 32 битка, лин....

Попробуйте всё это дело проделать через консольный вариант 7зипа. Т.е. 32 битное (ваше) приложение и "варианты" 7-зипа. Т.е. 32 битное и 64 битное. Интересен результат... Ну и конечно данные тесты на 64 битке, коль у вас это проще, на данном моменте...

Добавлено спустя 1 минуту 24 секунды:
Т.е. дайте консольке задачу из вашей проги. Без подгрузки длл со стороны приложения...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 18.07.2016 22:00:24

pupsik писал(а):Т.е. дайте консольке задачу из вашей проги. Без подгрузки длл со стороны приложения...

не понимаю.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Определение архитекуры процессора в OS Windows

Сообщение pupsik » 18.07.2016 22:09:48

В 7-зипе есть консольный вариант. Передаете ему команду на упаковку файла(каталога) через TProcess... Условия: 64 битная система, программа 32 битная и 2 варианта 7-зипа (32-х и 64-х битное). Какой из вариантов у вас сработает?
Т.е. работа не через длл, а через консоль 7-зипа...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 19.07.2016 05:34:04

pupsik писал(а):В 7-зипе есть консольный вариант. Передаете ему команду на упаковку файла(каталога) через TProcess... Условия: 64 битная система, программа 32 битная и 2 варианта 7-зипа (32-х и 64-х битное). Какой из вариантов у вас сработает?
Т.е. работа не через длл, а через консоль 7-зипа..

не вижу смысла в таком тесте.
1. 32 битный процесс может запускать 64 битный процесс (и обратное тоже возможно).
2. отношения такой тест к загрузке длл никакого отношения не имеет. А напартачить при запуске другого процесса можно очень просто, например не указав рабочую директорию запуска - и всё! будет казаться, что приложение не работает. Хотя к разрядности никакого отношения иметь не будет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Определение архитекуры процессора в OS Windows

Сообщение pupsik » 19.07.2016 10:27:19

И где запал? Или не ладное учуяли? :lol:

Добавлено спустя 51 секунду:
отношения такой тест к загрузке длл
ещё как имеет. Консолька то без длл никуда....
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 19.07.2016 16:35:44

pupsik писал(а):И где запал? Или не ладное учуяли?
...
ещё как имеет. Консолька то без длл никуда....

ну конечно пропал, мне кажется у тебя крайне смутные представления о том, как 32-битные приложения работают на 64-битной винде.
Хотя M$ достаточно хорошо всё описало. Во всяком случае для разработчиков прикладные приложений, вполне достаточно.

Так же описан механизм взаимодействия между 32-битным и 64-битным приложением.

И как я писал выше, приложения разной разрядности могут взаимно друг-друга запускать. Без каких либо проблем.

Вот тестовое приложения, оприентированное на 7zip.
Код: Выделить всё
program byproc;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}cthreads,{$ENDIF}
  Classes, SysUtils, process;

var
  exe : string;
  fn  : string;
  res : string;
begin
  if ParamCount<2 then begin
    writeln('please specify:');
    writeln('  7zip archiver executuable');
    writeln('  a file need to pack');
    Exit;
  end;
  exe:=ParamStr(1);
  fn:=ParamStr(2);
  res:='';
  writeln('packing ', fn,' with ', exe);
  if not RunCommand(exe, ['a',ChangeFileExt(fn,'7z'), fn], res) then begin
    writeln('failed');
  end else begin
    writeln('ran');
  end;
  writeln(res);
end.


Вот пример использования 64-битного 7zipа
Код: Выделить всё
byproc.exe x64\7za.exe readme.txt

Вот пример использования 32-битного 7zipа
Код: Выделить всё
byproc.exe 7za.exe readme.txt

оба случая работают.

Длл-ки тут ни при чём.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Определение архитекуры процессора в OS Windows

Сообщение pupsik » 19.07.2016 19:12:39

Чем этот архивчик хорош?! тем, что в нём есть и 32х битная и 64х битная версия библиотеки 7zip-а.
и включена архивация в бинарник. Поэтому длл и не нужна...

1.
Код: Выделить всё
byproc.exe 7z.exe readme.txt
он консольный (не гуи).
2.Переименуйте папку 7-зипа- если он установлен. Иначе "потащит" оттуда длл.
3.запустите и опишите что и кто ругнулся. (Т.е. 32 битный вариант и 64 битный.)

Вы спрашивали: откуда бралось. Я написал: оф. сборка 7 зипа (адресом). То что вы дали архивом... хм... тогда его не было (или плохо искал). Я пользовался тем что устанавливал 7зип инсталятором. А там только 7z.exe + dll. Сам 7z.exe паковать не умеет.

п.с.
Вроде внятно написал. Могу архивом скинуть сборки 7зипа.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 19.07.2016 19:45:08

pupsik писал(а):он консольный (не гуи).
2.Переименуйте папку 7-зипа- если он установлен. Иначе "потащит" оттуда длл.
3.запустите и опишите что и кто ругнулся. (Т.е. 32 битный вариант и 64 битный.)

Вы спрашивали: откуда бралось. Я написал: оф. сборка 7 зипа (адресом). То что вы дали архивом... хм... тогда его не было (или плохо искал). Я пользовался тем что устанавливал 7зип инсталятором. А там только 7z.exe + dll. Сам 7z.exe паковать не умеет.


Соглашусь, что 7z.exe без длл-ки не работает. (7za, исползьуемый мной ранее - работет).

У менят есть установленный 7-zip - 64 битный, хранится он в "C:\Program Files\7-Zip\7z.exe"
Запускаю тест (byproc - собран для 32-битной винды)
Код: Выделить всё
byproc.exe "C:\Program Files\7-Zip\7z.exe" readme.txt

Рабтает.

Далее, иду в папку "C:\Program Files\7-Zip\" переименовываю 7z.dll в 7z---.dll.
Запускаю:
Код: Выделить всё
byproc.exe "C:\Program Files\7-Zip\7z.exe" readme.txt

Не работает. RunCommand вернул false (т.е. вызванный процесс сообщил TProcess-у об ошибке, через existstatus не равный 0).
Замечу, что так или иначе 32-битное приложение запустило 64-битное, получив осмысленное сообщение.

Почему не работает?! - ну потому что я пошёл и руками выдрал нужную dll-ку. (7z.exe - 64 битный требует 64-битную ддл-ку, 7z.exe - 32битный потребует 32 битную длл-ку. И раз я свободно оперирую этими архиваторами, то это моя ответственность правильному .exe дать правильную версию .dll)
Тут уж не винда, а именно мои "кривые руки" виноваты, на что указывал Лекс Айрин.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Определение архитекуры процессора в OS Windows

Сообщение pupsik » 19.07.2016 21:04:57

7z.exe - 32битный потребует 32 битную длл-ку
вы это проверяли? Т.е. все 32 битное...
По поводу "7za". Уж не помню точно. Если не изменяет память то он пакует только один файл. Может и ошибаюсь.... Но что то в 7зипе могло паковать только один файл, а что то нет. Не помню только что. И, кажись, это было связано только с его родным форматом. Ну не помню....
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Определение архитекуры процессора в OS Windows

Сообщение скалогрыз » 19.07.2016 21:16:02

pupsik писал(а):вы это проверяли? Т.е. все 32 битное...

да. всё 32-битное, если взять 32-битную версию.
в 64-битной версии, всё будет 64-битное!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240

Рейтинг@Mail.ru