Форум: "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