Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск программы из под IDE. Проблемы..


Страницы:   1 2

jack128 ©   (2004-09-08 04:14:00) 

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

Есть несколько досовских программ, их нужно запустить из моей программы. Все очень просто - 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 кнопки - Закрыть и Пропустить..  В тоже время есть я свою прогу запускаю из Эксплоерера, то все работает нормально...  Может кто знает, чем причина??


GuAV   (2004-09-09 23:49:00) [1]


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

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


GuAV   (2004-09-09 23:25:00) [2]

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


GuAV   (2004-09-09 23:09:00) [3]

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


jack128   (2004-09-09 22:50:00) [4]

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


GuAV   (2004-09-09 21:52:00) [5]

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


GuAV   (2004-09-09 21:43:00) [6]


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

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

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


jack128   (2004-09-09 21:39:00) [7]

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

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

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

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


GuAV   (2004-09-09 21:23:00) [8]


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

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


GuAV   (2004-09-09 21:18:00) [9]


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

Однако, они и так не отлаживаются. Эта прога оказалась хитрее винды. Смотри, запускаем такое
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


VMcL   (2004-09-09 21:17:00) [10]

>> 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 ими воспользовался.


jack128   (2004-09-09 20:24:00) [11]

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

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


jack128   (2004-09-09 19:16:00) [12]

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


GuAV   (2004-09-09 19:09:00) [13]


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

Та давай.


jack128   (2004-09-09 19:04:00) [14]

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


GuAV   (2004-09-09 19:03:00) [15]

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


GuAV   (2004-09-09 18:39:00) [16]

Во блин. Это значит нужно вообще забить на справку и юзать мсдн только, раз в справке совсем не то:
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.
Досовская прога большая?


jack128   (2004-09-09 18:11:00) [17]

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 12:11:00) [18]


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

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

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


jack128   (2004-09-09 05:11:00) [19]


> GuAV ©  

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


GuAV   (2004-09-08 21:17:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо