Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2019, 15:37   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
я извращенец, по-этому расскажу извращенный способ:
запускать блокнот через CreateProcess() и запоминать хэндл его процесса. А перед открыванием нового файла, убивать блокнот по хэндлу и запускать новый.
С этим есть проблемы так как закрывается он по ID на не по хэндлу.

Код:
var
  newstdin,newstdout,read_stdout,write_stdin:THANDLE;  //дескрипторы

  si:TSTARTUPINFO;
  sa:TSECURITYATTRIBUTES;
  sd:TSECURITYDESCRIPTOR;        //структура security для пайпов
  pin:TPROCESSINFORMATION;
function IsWinNT:boolean;
var osv:TOSVERSIONINFO;
begin
{
  OSVERSIONINFO osv;
  osv.dwOSVersionInfoSize = sizeof(osv);
  GetVersionEx(&osv);
  return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
osv.dwOSVersionInfoSize := sizeof(osv);
GetVersionEx(osv);
Result:=(osv.dwPlatformId = VER_PLATFORM_WIN32_NT);
end;

procedure TerminateBochs;
const
 ExeFileName: string='bochsdbg.exe';
 PROCESS_TERMINATE = $0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
 begin
 if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
 UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
 UpperCase(ExeFileName))) then
 TerminateProcess(
 OpenProcess(PROCESS_TERMINATE,
 BOOL(0),
 FProcessEntry32.th32ProcessID),
 0);
 ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;


procedure StartBochs;
begin
TerminateBochs;
 if (IsWinNT) then        //инициализация security для Windows NT
  begin
    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, NiL, false);
    sa.lpSecurityDescriptor := @sd;
  end else sa.lpSecurityDescriptor := Nil;

  sa.nLength := sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := true;       //разрешаем наследование дескрипторов

  if not(CreatePipe(newstdin,write_stdin,@sa,0))then   //создаем пайп
  begin                                                  // для stdin
//    ErrorMessage("CreatePipe");
//    getch();
//    return;

  end;
  if not(CreatePipe(read_stdout,newstdout,@sa,0)) then //создаем пайп
   begin                                        // для stdout
//    ErrorMessage("CreatePipe");
//    getch();
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
//    return;
  end;

  GetStartupInfo(si);      //создаем startupinfo для
                            // дочернего процесса

  {

  Параметр dwFlags сообщает функции CreateProcess
  как именно надо создать процесс.

  STARTF_USESTDHANDLES управляет полями hStd*.
  STARTF_USESHOWWINDOW управляет полем wShowWindow.

  }

  si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_SHOWNORMAL;//SW_HIDE;
  si.hStdOutput := newstdout;
  si.hStdError := newstdout;   //подменяем дескрипторы для
  si.hStdInput := newstdin;    // дочернего процесса

 if IsWinNT=true then

 if not(CreateProcess(nil,'C:\Program Files (x86)\Bochs-2.6.8\bochsdbg.exe  -q -f ".\bochs\bochsrc.bxrc"',Nil,NiL,TRUE,CREATE_NEW_CONSOLE,
// if not(CreateProcess(nil,'C:\Bochs-2.6.9\bochsdbg.exe  -q -f ".\bochs\bochsrc.bxrc"',Nil,NiL,TRUE,CREATE_NEW_CONSOLE,
                     NiL,NiL,si,pin)) then
  begin
    ShowMessage('Ошибка создания процесса Bochs');
    CloseHandle(newstdin);
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);
  end;


end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.08.2019 в 15:44.
Pavia вне форума Ответить с цитированием
Старый 03.08.2019, 15:48   #12
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
С этим есть проблемы так как закрывается он по ID на не по хэндлу.
перепутал, но это не важно. Смысл понятен. Запомнить результат CreateProcess(), а потом найти и убить процесс. Так вроде можно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 04.08.2019, 02:25   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Andru_ Посмотреть сообщение
Мне нужно открывать из программы разные файлы.
И пока никто не спросил зачем? И почему нужно именно вызовом сторонней программы? И почему нужен именно один экземпляр конкретной сторонней программы?
northener вне форума Ответить с цитированием
Старый 04.08.2019, 08:03   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

northener, он же вопросом про вьюверы практически ответил. Вьювер хочет написать и думал это сделать вызовом блокнота/просмотрщика картинок/автокада/...
p51x вне форума Ответить с цитированием
Старый 04.08.2019, 18:57   #15
Andru_
Пользователь
 
Регистрация: 18.06.2019
Сообщений: 29
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А что вам непонятно? Условно и упрощенно: смотрят - файл txt, текст - показывают в мемо, файл jpg, bmp,... картинка - грузять, декодируют, показывают в имадж или так рисуют, и т.д.
С этими понятно.
Но мне нужно как-то организовать быстрый просмотр ещё, как-минимум, акадовских и инвентори файлов.
Andru_ вне форума Ответить с цитированием
Старый 04.08.2019, 20:35   #16
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? Открываете кадовский файл, парсите его, строите сцену, ... и рисуете.
p51x вне форума Ответить с цитированием
Старый 05.08.2019, 01:11   #17
Andru_
Пользователь
 
Регистрация: 18.06.2019
Сообщений: 29
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И? Открываете кадовский файл, парсите его, строите сцену, ... и рисуете.
А функциональность? масштабирование, вращение для 3D-моделей?
Andru_ вне форума Ответить с цитированием
Старый 05.08.2019, 01:18   #18
Andru_
Пользователь
 
Регистрация: 18.06.2019
Сообщений: 29
По умолчанию

У AutoVue от Oracle есть библиотека и компонент вьювера.
Но, к сожалению, на Windows10 AutoVue уже не ставится.
Andru_ вне форума Ответить с цитированием
Старый 05.08.2019, 01:23   #19
Andru_
Пользователь
 
Регистрация: 18.06.2019
Сообщений: 29
По умолчанию

У меня была программа, с просмотром файлов через AutoVue.
И голова не болела. Теперь на W10 нужно что-то придумать.
Andru_ вне форума Ответить с цитированием
Старый 05.08.2019, 02:43   #20
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
northener, он же вопросом про вьюверы практически ответил. Вьювер хочет написать и думал это сделать вызовом
Обломится. Не в том что это невозможно, но в том что "конфетки" не получится.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как через Java Swing прописать на кнопку открывание папки lubasha9191 Общие вопросы по Java, Java SE, Kotlin 2 05.02.2016 09:54
Открывание .txt через WIN32 chev-91 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 27.05.2011 12:07
Запуск исполняемых файлов из программы Dryg2009 Общие вопросы Delphi 7 15.04.2009 07:50
Запуск файлов программы d_slava Помощь студентам 2 17.06.2008 11:22
Создание программы для запароливания файлов шолku Общие вопросы Delphi 14 05.01.2007 08:32