Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.07.2014, 09:39
VoroneTZ VoroneTZ вне форума
Прохожий
 
Регистрация: 25.07.2014
Адрес: Ставрополь
Сообщения: 4
Версия Delphi: D XE6, 3DGS A8
Репутация: 10
Восклицание CreateProcess Delphi XE6

Привет ребят
столкнулся очень странной для меня проблемой
в общем по порядку
Приложение лаунчер (что то вроде Steam клиента), первоначально разрабатывалось на D7, теперь же использую DXE6
После перехода на XE6 стало работать не корректно, а точнее функция запуска приложений

Код:
procedure TMain.LaunchProg(programId:string);
var
  StartUpInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  a,filename:string;
  FThread: TProcessThread;
begin
  FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
  with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;
  end;

  FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);

    a:=VSProg.Text[VSProg.GetVisibleParent(VSProg.FocusedNode),1]; //командная строка запуска хранится в строке VirtualTree

    filename:=GetProgramExe(programId);
    showmessage(filename); //путь к файлу правильный

    CreateProcess(PChar(filename),PWideChar('/c '+'"'+a+'"'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);

    a:=inttostr(ProcessInfo.dwProcessId)+' '+VSProg.Text[VSProg.FocusedNode,1]+'/'+
      VSProg.Text[VSProg.GetVisibleParent(VSProg.FocusedNode),1];
    ProgList.items.add(a); //лист с открытыми приложениями
  
    FThread := TProcessThread.Create(ProcessInfo.hProcess);
    FThread.Resume;
    FThread.Text:=a; //присваем потоку номер что бы при закрытии приложение знало какое приложение из листа было закрыто
    FThread.OnTerminate := myProcessTerminate;
end;

на Delphi 7 все работало на пятерочку
в XE6 все работает правильно, кроме самого CreateProcess
что происходит
Запускаю приложения по порядку (1.exe,2.exe,3.exe,4.exe)
Первый запуск корректный, последующие открывают предыдущее приложение (т.е порядок 1.exe,1.exe,2.exe,3.exe)

запуск в режиме отладки показал что CreateProcess передаются правильные параметры файла и командной строки

Так же если мы откроем приложение дважды (в порядке 1.exe,2.exe,2.exe), то выдаст ошибку "Файл занят другим процессом"
но что происходит
1. открывается 1.exe
2. открывается 1.exe
3. говорит что 2.exe занят другим процессом

PS работать с процессами научил меня гугл и копипаст. XE6 не кривая
Ответить с цитированием
  #2  
Старый 25.07.2014, 10:29
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Настораживает, то что вы поток запускаете раньше, чем заполнили все его параметры. Переставьте Resume в самый конец.
Не смог найти GetProgramExe, потому предположу что это ваша функция, возможно она возвращает неверный результат.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 25.07.2014, 10:43
VoroneTZ VoroneTZ вне форума
Прохожий
 
Регистрация: 25.07.2014
Адрес: Ставрополь
Сообщения: 4
Версия Delphi: D XE6, 3DGS A8
Репутация: 10
По умолчанию

GetProgramExe работает стабильно, на то там и ShowMessage, переставил в ресум в конец- не помогло, вот проблема в картинках



запускаем Admin, его экзешник Launcher.exe



открыл правильно, вай маладец, пять с плюсом тебе
админа пока закрывать не будем, но откроем проект Tree, путь правильный




но что мы видим?



давай ка закроем все и попробуем снова
Ответить с цитированием
  #4  
Старый 25.07.2014, 10:45
VoroneTZ VoroneTZ вне форума
Прохожий
 
Регистрация: 25.07.2014
Адрес: Ставрополь
Сообщения: 4
Версия Delphi: D XE6, 3DGS A8
Репутация: 10
По умолчанию

закроем все (процесс tree.exe занят же!) и откроем снова!



и что мы видим? tree.exe!



но дело в том, если бы я решил открыть Admin, то все равно открылся бы tree.exe
Ответить с цитированием
  #5  
Старый 25.07.2014, 11:03
VoroneTZ VoroneTZ вне форума
Прохожий
 
Регистрация: 25.07.2014
Адрес: Ставрополь
Сообщения: 4
Версия Delphi: D XE6, 3DGS A8
Репутация: 10
По умолчанию

ПРОБЛЕМА РЕШЕНА (ну точнее она не в CreateProcess)

т.к. это "Steam" клиент, он загружает и обновляет приложения из Базы Данных.. ну и вручную открыв приложения, я понял что он скачивает и переустанавливает одно приложение на другое..
очень странно, учитывая что обновление (что и происходит) происходит только в том случае, если не совпадает MD5 и версия exe, но наблюдение за ходом проверки актуальности обновления дали положительные результаты, и нечего скачиваться не должно было... в общем продолжаю рыться в коде..
как я понимаю всему вина неадекватная работа DataSet.Locate (в любой версии делфи он работает через раз (SQL Server 2008))
заменил все Locate (поиск нужного фала в БД) фильтром (т.е. отображается только нужный файл) и все работает как часы
извините за засорение форума

Последний раз редактировалось VoroneTZ, 25.07.2014 в 11:11.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025