Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Запуск программы из под IDE. Проблемы..   Найти похожие ветки 

 
jack128 ©   (2004-09-08 04:14) [0]

Мдя.. На такую фигню сейчас наткнулся:

Есть несколько досовских программ, их нужно запустить из моей программы. Все очень просто - CreateProcess, и вперед и с песнями..
Запускаю с помощью такой функции:

 function RunAndWait(FileName: string): Cardinal;
 var
   si: TStartupInfo;
   pi: TProcessInformation;
 begin
   ZeroMemory(@si, SizeOf(si));
   si.cb := SizeOf(si);
   Win32Check(CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil,
     PChar(ExtractFilePath(FileName)), si, pi));
   try
     CloseHandle(pi.hThread);
     if WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 then
       RaiseLastWin32Error;
     Win32Check(GetExitCodeProcess(pi.hProcess, Result));
   finally
     CloseHandle(pi.hProcess);
   end;
 end;


Так вот, если я запускаю свою программу из под IDE и в ней вызываю эту функцию, то досовская прога аварийно завершается со словами: "Процессор NTDVM обнаружел недопустимую инструкцию. CS:040a IP:0569 OP:8d f3 03 b7 00 Для завершения работы приложения нажнмите кнопку "Закрыть"" И 2 кнопки - Закрыть и Пропустить..  В тоже время есть я свою прогу запускаю из Эксплоерера, то все работает нормально...  Может кто знает, чем причина??


 
jack128 ©   (2004-09-08 04:19) [1]

Да. Аварийно завершаются не ВСЕ досовские проги, а только некоторые(точнее пока одна, но нет гарантии, что остальные так себя не будут вести..)


 
Digitman ©   (2004-09-08 09:05) [2]

вероятно, такое разное поведение связано с наличием или отсутствием соответствующих pif-файлов


 
jack128 ©   (2004-09-08 13:43) [3]

Digitman ©   (08.09.04 9:05) [2]
вероятно, такое разное поведение связано с наличием или отсутствием соответствующих pif-файлов

В смысле?? pif"ов нету нигде. И потом, я же не pif запускаю, а непосредственно EXE.


 
VMcL ©   (2004-09-08 13:49) [4]

>>jack128 ©  (08.09.04 13:43) [3]

Посмотри сюда, здесь нет записи о твоей программе?
HKEY_CURRENT_USER\Console


 
jack128 ©   (2004-09-08 14:41) [5]

VMcL ©   (08.09.04 13:49) [4]
нет. Тут вообще ни одной проги не прописано. Только внешний вид консоли.


 
VMcL ©   (2004-09-08 15:27) [6]

>>jack128 ©  (08.09.04 13:43) [3]

Кстати, независимо от того, запускаешь ли ты через PIF или напрямую через EXE/COM, Windows запускает через одноименный PIF, если он, конечно, есть.


 
GuAV ©   (2004-09-08 20:54) [7]

При попытке дизасемблирования ShellExecuteEx выяснено, что заместо 0 использваны следующие флаги:

CREATE_DEFAULT_ERROR_MODE
CREATE_NEW_PROCESS_GROUP
CREATE_NEW_CONSOLE  // при каких-то обстоятельствах, каких - не разбрал.

Имхо дело в этих флагах.


 
GuAV ©   (2004-09-08 21:07) [8]


> я запускаю свою программу из под IDE

В интерированном отладчике дело или нет?
если Tools->Debugger Options->Integrated debugging выкл, то что тогда ?

зы [7] - маловероятно, написал не заметив


> свою прогу запускаю из Эксплоерера


 
GuAV ©   (2004-09-08 21:17) [9]

... а если дело в отладчике, можно попробовать такой флаг:
DEBUG_ONLY_THIS_PROCESS


 
jack128 ©   (2004-09-09 05:11) [10]


> GuAV ©  

Да, ты прав, если отключить дебагинг, то вызов происходит нормально. А насчет DEBUG_ONLY_THIS_PROCESS такой вопрос: как я могу заставить IDE запустить меня с этим флагом?? Что то я не увидел в опциях ничего подобного..


 
GuAV ©   (2004-09-09 12:11) [11]


>    Win32Check(CreateProcess(nil, PChar(FileName), nil,
>nil, False, 0, nil,
>      PChar(ExtractFilePath(FileName)), si, pi));

Вот заместо нолика и пишешь DEBUG_ONLY_THIS_PROCESS.

Смысл флага
В случае отладки твоего процесса, процесс вызванный твоим не будет отлажен. В случае когда твой процесс не отлаживается он ничего не означает.


 
jack128 ©   (2004-09-09 18:11) [12]

GuAV ©   (09.09.04 12:11) [11]
В случае отладки твоего процесса, процесс вызванный твоим не будет отлажен. В случае когда твой процесс не отлаживается он ничего не означает.


А!! Нет,  ты не так понял смысл этого флага. Я тоже так сначало подумал, но мсдн, как всегда внес ясность ;-)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/process_creation_flags.asp


 
GuAV ©   (2004-09-09 18:39) [13]

Во блин. Это значит нужно вообще забить на справку и юзать мсдн только, раз в справке совсем не то:
If not set and the calling process is being debugged, the new process becomes another process being debugged by the calling process"s debugger. If the calling process is not a process being debugged, no debugging-related actions occur.
Досовская прога большая?


 
GuAV ©   (2004-09-09 19:03) [14]

Кстати, читал про CREATE_SEPARATE_WOW_VDM внизу?
Может стоит попробовать CREATE_SEPARATE_WOW_VDM or DEBUG_ONLY_THIS_PROCESS or ещё чего нибудь... хотя это уже шаманство.


 
jack128 ©   (2004-09-09 19:04) [15]

GuAV ©   (09.09.04 18:39) [13] 114 кб.. Хочешь покопаться??


 
GuAV ©   (2004-09-09 19:09) [16]


> Хочешь покопаться??

Та давай.


 
jack128 ©   (2004-09-09 19:16) [17]

GuAV ©   (09.09.04 19:09) [16]
ушло..


 
jack128 ©   (2004-09-09 20:24) [18]

Блин, я дебил.  Дло в том, что эта прога защищена аппартным ключем, там где в коде прошито, чтобы её нельзя было нормально запустить под отладкой.

Ладно, перефразируем вопрос:
как я могу заставить IDE запустить мою программу с флагом DEBUG_ONLY_THIS_PROCESS?? Чтобы процессы, запущенные мной не отлаживались


 
VMcL ©   (2004-09-09 21:17) [19]

>>jack128 ©  (09.09.04 20:24) [18]

Вижу такие способы:

1. Какой-нибудь мало-, но всё-таки документированный прием, - например, что-нить прописать в реестре [сомнительно, что есть].

2. Отладить delphi32.exe другим отладчиком (нахальством будет, если продебажить его самим собой - второй копией:), найти место, где вызывается CreateProcess (A/W) по действию Run и внаглую пропатчить [нехорошо с лицензионной стороны].

2a. То же, что и в п. 2, только патчить не файл, а с помощью вспомогательного процесса совершить патч в памяти [не так плохо с лицензионной стороны, а может и вообще нормально].

3. Сделать API Hook на delphi32.exe или какую-то из используемых им библиотек с перехватом ф-ции CreateProcess и подставить нужные флаги.

P.S. AFAIR, кроме CreateProcess есть еще какие-то функции типа NtCreateProcess(), но я сомневаюсь, что Borland ими воспользовался.


 
GuAV ©   (2004-09-09 21:18) [20]


> Чтобы процессы, запущенные мной не отлаживались

Однако, они и так не отлаживаются. Эта прога оказалась хитрее винды. Смотри, запускаем такое
program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

function IsDebuggerPresent(): LongBool;
 external "kernel32.dll";

begin
 WriteLn("DEBUG = "+BoolToStr(IsDebuggerPresent(), True));
 ReadLn; // читаем выход, товарищи...
end.


Выход: DEBUG = True

запускаем такое

program Project2;
...// тут стандартно

unit Unit1;
...

procedure TForm1.Button1Click(Sender: TObject);
begin
 RunAndWait("C:\Program Files\Borland\Delphi7\Projects\project1.exe");
end;


Выход: DEBUG = False

Т.е. Винда не считает что вызываемый процесс отлаживается.
зы: я на не-NT можешь ещё раз у себя на NT проверить...

попробуй там ещё промежуточный батник, где start/wait 1,exe


 
GuAV ©   (2004-09-09 21:23) [21]


>  (нахальством будет, если продебажить его самим собой
> - второй копией:),

А это стандартно - так отлаживаетсяработа  компонентов в дезайн-тайм. ИМХО.


 
jack128 ©   (2004-09-09 21:39) [22]

GuAV ©   (09.09.04 21:18) [20]
Т.е. Винда не считает что вызываемый процесс отлаживается.
зы: я на не-NT можешь ещё раз у себя на NT проверить...

Под NT твоя консоль тоже под отладкой..

> VMcL ©   (09.09.04 21:17) [19][Ответить]
С теоретической и позновательной точки зрения мне интересен способ 3 (отлаживать Дельфю меня как то ломает ;-))  А на практике будем использовать демку программы. Хоть и глючная, но зато без защиты..

Всем спасибо, вопрос закрыт.


 
GuAV ©   (2004-09-09 21:43) [23]


> Под NT твоя консоль тоже под отладкой..

То есть ? в program Project2; Выход: DEBUG = True ?
сейчас попробую в NT.

Прога кстати INT 1 использует. Тяжелый случай.


 
GuAV ©   (2004-09-09 21:52) [24]

Так вот где это настраивается
Tools->Debugger Options->General->Debug spawned processes


 
jack128 ©   (2004-09-09 22:50) [25]

GuAV ©   (09.09.04 21:52) [24]
Не-а. DEBUG = True в любом случае.  Если стоит галка, то при запуске нового процесса открывает окно CPU, но процесс находится под отладкой в любом случае..Попробую под 9x ..


 
GuAV ©   (2004-09-09 23:09) [26]

<off>мыльницу ещё проверяй</off>


 
GuAV ©   (2004-09-09 23:25) [27]

а с батникам как? если запускать такой run1.bat:
@start/wait 1.exe
?


 
GuAV ©   (2004-09-09 23:49) [28]


> Не-а. DEBUG = True в любом случае.  Если стоит галка,
> то при запуске нового процесса открывает окно CPU, но
> процесс находится под отладкой в любом
> случае..Попробую под 9x ..

Мне в ХР повторить этот результат не удалось. DEBUG = False
Так что несколько мыслей есть, но проверить не могу, т.к. у меня этой проблемы нет.



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
4-1094644439
Apolo
2004-09-08 15:53
2004.10.10
Пару вопросов по потокам


14-1095664299
Holy
2004-09-20 11:11
2004.10.10
Наладонники


1-1095560171
Matveyev
2004-09-19 06:16
2004.10.10
Создание файлов ресурсов


3-1095184734
Вано
2004-09-14 21:58
2004.10.10
Проверка структуры таблицы


1-1095758581
Goga
2004-09-21 13:23
2004.10.10
Управление TADODataSet из TThread