![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Привет ребят
столкнулся очень странной для меня проблемой в общем по порядку Приложение лаунчер (что то вроде 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
|
||||
|
||||
![]() Настораживает, то что вы поток запускаете раньше, чем заполнили все его параметры. Переставьте Resume в самый конец.
Не смог найти GetProgramExe, потому предположу что это ваша функция, возможно она возвращает неверный результат. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() GetProgramExe работает стабильно, на то там и ShowMessage, переставил в ресум в конец- не помогло, вот проблема в картинках
![]() запускаем Admin, его экзешник Launcher.exe ![]() открыл правильно, вай маладец, пять с плюсом тебе админа пока закрывать не будем, но откроем проект Tree, путь правильный ![]() но что мы видим? ![]() давай ка закроем все и попробуем снова |
#4
|
|||
|
|||
![]() закроем все (процесс tree.exe занят же!) и откроем снова!
![]() и что мы видим? tree.exe! ![]() но дело в том, если бы я решил открыть Admin, то все равно открылся бы tree.exe |
#5
|
|||
|
|||
![]() ПРОБЛЕМА РЕШЕНА (ну точнее она не в CreateProcess)
т.к. это "Steam" клиент, он загружает и обновляет приложения из Базы Данных.. ну и вручную открыв приложения, я понял что он скачивает и переустанавливает одно приложение на другое.. очень странно, учитывая что обновление (что и происходит) происходит только в том случае, если не совпадает MD5 и версия exe, но наблюдение за ходом проверки актуальности обновления дали положительные результаты, и нечего скачиваться не должно было... в общем продолжаю рыться в коде.. как я понимаю всему вина неадекватная работа DataSet.Locate (в любой версии делфи он работает через раз (SQL Server 2008)) заменил все Locate (поиск нужного фала в БД) фильтром (т.е. отображается только нужный файл) и все работает как часы извините за засорение форума ![]() Последний раз редактировалось VoroneTZ, 25.07.2014 в 11:11. |