Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

Запуск программы из под 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.068 c
14-1093725767
Marser
2004-08-29 00:42
2004.10.10
Вопрос спортсменам


1-1096008720
RoLeX2004
2004-09-24 10:52
2004.10.10
Как проверить соответствует ли имя файла заданной маске?


1-1096272219
Dimastiy04
2004-09-27 12:03
2004.10.10
Расстягивание скинообразной формы приложения


14-1095459260
123
2004-09-18 02:14
2004.10.10
ЭВМ былых времен.


14-1095436250
Igorek
2004-09-17 19:50
2004.10.10
Проблема с сетевым принтером HP LaserJet 2300d





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский