Страница 1 из 1

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 14:45
finsoftrz
Сейчас некоторые утилиты доступны только в 64 разрядном исполнении. Чтобы запустить их из кларионовского приложения, надо использовать функцию win api Wow64DisableWow64FsRedirection. Запускать можно через run или shellexec. Если кому надо, позже могу выложить в составе класса.
Прототип функции.

Код: Выделить всё

     MODULE('kernel32.dll') 
     fsWAE_Wow64DisableWow64FsRedirection(*ULONG),BOOL,PASCAL,RAW,DLL(_Wow64DisableWow64FsRedirection_),name('Wow64DisableWow64FsRedirection')   
     END
Вызов примерно так.

Код: Выделить всё

RunApp64 PROCEDURE (STRING pName)
loc:var   ulong
      CODE   

       if fsWAE_Wow64DisableWow64FsRedirection(loc:var)=1
          run(pName)  
       .     

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 16:07
Игорь Столяров
finsoftrz писал(а): 13 Апрель 2025, 14:45 Если кому надо
Пардон, но это не запуск, переназначение рабочего каталога System32 ...
Давно с этим не работал, но там кажется ещё нужно потом обратно переключать сразу после запуска, иначе всё рухнет ...
Посмотрите пожалуйста лучше сами в WinAPI ! :D

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 17:02
finsoftrz
Запускаются именно 64 разрядные версии утилит. Я экспериментировал с quser. Если запустить что-то типа run('cmd.exe /c quser > 1.txt'), то будет ошибка, что такая команда не существует, так как quser для 32 разрядов нет, а вызывается 32 разрядная версия cmd из wow64. Если аналогично запустить после вызова Wow64DisableWow64FsRedirection, то информация появляется, так как вызывается 64 битная версия cmd из system32.
Если просто будете пытаться запустить 64 разрядную утилиту из 32 разрядного приложения, то она будет выполняться по умолчанию в wow64, что приводит к аварийному завершению.
Надо ли переключаться обратно, в примере использования не было. Я так понял, что в данном случае не требуется. Проблем не заметил, все работает штатно после данного вызова.

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 17:38
Игорь Столяров
finsoftrz писал(а): 13 Апрель 2025, 17:02 то информация появляется, так как вызывается 64 битная версия cmd из system32
Ни в коем случае не ставлю под сомнение пройденный путь ... но не проще ли для вызова одиночной утилиты
QUSER.EXE получить штатными средствами путь к папке SYSTEM32 и просто вызвать её по полному имени ?
(я не пробовал)

Переназначение системной папки это мощный экскаватор, им можно разнести детскую песочницу вместо вскапывания ... 🤷‍♂️

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 18:09
finsoftrz
Игорь, я же написал, если вызывать 64 битные утилиты из 32 битных приложений, то они по умолчанию будут запускаться в wow64, что завершится аварийным выходом. То есть, wow64 это виртуальная машина для 32 битных приложений, а Вы предлагаете запускать на ней 64 битные.

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 18:23
Игорь Столяров
finsoftrz писал(а): 13 Апрель 2025, 18:09 а Вы предлагаете запускать на ней 64 битные.
Спасибо. Я понял. 🤦‍♀️

Запуск 64 разрядных приложений из клариона

Добавлено: 13 Апрель 2025, 18:59
finsoftrz
Это довольно важный ресурс. Например, не так давно работали с честным знаком, где требуется интерфейс для доступа к сертификатам. Я вначале не мог понять, делаю на vbscript, тестирую через запуск в проводнике, все работает, вызываю из своего приложения, не работает. Выход тогда нашли, установив старую библиотеку для win32, которая хоть и не поддерживается давно MS, но работает. Причина таже самая, из кларионовского приложения запускалась 32 разрядная версия vbscript, которая не работала с актуальной win64 библиотекой.
А через этот механизм мы можем взаимодействовать с 64 битными утилитами и скриптовыми движками, а дальше по цепочке. Обмен через файлы, старый и надежный способ.

Запуск 64 разрядных приложений из клариона

Добавлено: 14 Апрель 2025, 8:06
finsoftrz
Уточнил, переключаться назад надо с помощью функции Wow64RevertWow64FsRedirection с аналогичным прототипом. В качестве параметра передавать ссылку на ту же ulong переменную, которую указывали при вызове Wow64DisableWow64FsRedirection. Все вызовы run/shellexec между этими переключателями запускают нативные win64 приложения.

Точнее сказать, если запускать 32 битные приложения после Wow64DisableWow64FsRedirection, то они запускаются. А 64 битные приложения без предварительного Wow64DisableWow64FsRedirection нет.

Запуск 64 разрядных приложений из клариона

Добавлено: 14 Апрель 2025, 8:14
Игорь Столяров
finsoftrz писал(а): 14 Апрель 2025, 8:06 переключаться назад надо
Да, что-то вроде того ... Я уже и не помню где мы с этим работали.
Кажется, нужно нужно "переходить" в SYSTEM32 x64 для запуска экранной клавиатуры.

Запуск 64 разрядных приложений из клариона

Добавлено: 14 Апрель 2025, 9:16
finsoftrz
Есть еще функция GetNativeSystemInfo, через которую проще всего определить, что работаем под 64 битной ОС (правда, в msdn описание принимающей структуры, похоже, устарело).
То есть мы можем взаимодействовать с 64 битными или 32 битными скриптовыми движками (vbscript, pyton и т.п.), убрав это все внутрь класса. Соответственно, через 64 битный скриптовый движек получаем доступ к 64 битным ресурсам ОС и сторонним библиотекам.