Как запустить документ в ассоциированной программе?
Posted: Sun Jun 16, 2019 1:52 am
by AZJIO
Как использовать ShellExecute (ShellExecuteEx), чтобы открыть файл-документ в ассоциированной программе или использовать AssocQueryString, чтобы получить путь к программе и далее использовать его с путём файла? Или FindExecutable, ведь у нас пути существующие.
var oSys = AkelPad.SystemFunction();
var hEditWnd = AkelPad.GetEditWnd();
var pEditFile = AkelPad.GetEditFile(0);
var pFileExt = AkelPad.GetFilePath(pEditFile, 4 /*CPF_FILEEXT*/);
// var sFileExt = (pFileExt.toLowerCase())
var sFile = GetAssocString("." + pFileExt)
switch (pFileExt.toLowerCase())
{
case "bat":
case "cmd":
AkelPad.Exec('%comspec% /c "' + pEditFile + '"'); // куда без костылей
break;
default:
// для "reg" нужны права админа, тогда работает
// AkelPad.MessageBox(hEditWnd, sFile + ' "' + pEditFile + '"', "Результат", 0); // посмотреть ком-строку на ошибки
AkelPad.Exec(sFile + ' "' + pEditFile + '"');
break;
}
function GetAssocString(sStr)
{
var sFile = "";
var lpFile = AkelPad.MemAlloc(260 * 2);;
var lpSize = AkelPad.MemAlloc(4);
AkelPad.MemCopy(lpSize, 260, 3 /*DT_DWORD*/);
if (oSys.Call("Shlwapi::AssocQueryStringW", 0, 2 /*ASSOCSTR_EXECUTABLE*/, sStr, "open", lpFile, lpSize) == 0 /*S_OK*/)
sFile = AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpFile);
AkelPad.MemFree(lpSize);
return sFile;
}
И тут проблема, для запуска прог требующих админ-права команда запуска не выполняется, хотя ожидается запуск с подтверждением запуска от админа, но не происходит ничего. Запускаю AkelPad от админа и всё работает.
с использованием ShellExecuteEx. Взял отсюда, там не совсем нужное - для свойств файла, но я переделал под запуск файла, теперь работают и reg и bat без всяких ухищрений. Возможно так как я удалил поле lpVerb в структуре, то размер её должен быть уменьшен, но по крайней мере вреда от этого нет.
Используя "lpVerb" мы можем указать пункт в реестре, например edit (Изменить) вместо open (Открыть)
Мой вариант для reg-файлов работает лучше, выводит на передний план, а по закрытию возвращает активность AkelPad`у, вместо открытия на заднем плане с мигающей кнопкой на панели задач, а при отмене не возвращает активность AkelPad`у.
Posted: Mon Sep 02, 2019 6:16 pm
by AZJIO
Улучшение: так как при запуске js-файлов тупо запускалось внешней прогой с напоминанием об ошибке и бессмысленностью выполнения, теперь это работает как запуск в контексте запуска js-скриптов внутри AkelPad, то есть фактически происходит тест редактируемого в данный момент скрипта, без поиска в меню "Запуск последнего" и без открытия списка всех ваших скриптов в GUI и поиска его имени там, просто выбрал вкладку нажал F5. По умолчанию F5 - переоткрыть файл, но лично я ни разу не пользовался этим пунктом за многие года использования Notepad++, во первых при внешнем изменении он сам переоткрывается, а внутри жмёшь отмена действий, поэтому F5 у меня всегда был запуск файла в ассоциированной программе. Чтобы этот скрипт не запускал сам себя в цикле (миллиард раз пока включен комп мучая проц и hdd) добавил игнор на его имя.