Здарова, -=BorMaN=-!
11 марта 2004 г., четверг, 22:50:37 (GMT+05:00), ты намылил:
Surin_bp>> Тема: Cpp Builder | Delphi WinExec
>>> Есть такая API'шная функция
>>> UINT WinExec(LPCSTR lpCmdLine, // address of command line
>>> UINT uCmdShow // window style for new application
Surin_bp>> Всегда лучше использовать CreateProcess - не
Surin_bp>> интересовался в Builder'e, но в
Surin_bp>> Delphi все равно идет вызов CreateProcess
Вот код WinExec:
function WinExec; external kernel32 name 'WinExec';
Вот цитата из хелпа:
The CreateProcess function is used to run a new program.
The WinExec and LoadModule functions are still available,
but they are implemented as calls to CreateProcess.
Складываем 2 + 2, получаем что WinExec - функция API в которой
вызывается CreateProcess - так же функция API, т.е. WinExec и на
ассемблере будет вызывать CreateProcess.
B> Говорят, что прога, загруженная через CreateProcess может закрится при закрытии
B> запустившей ее проги... Это так?
Держи прогу с помощью которой я запускаю Bat + MyGate (кривовата
прога, но работает):
program RunBat;
uses
Windows, Messages;
var hProcess: THandle;
function RunAppAndWait(CmdLine, WorkDir: string; Wait: boolean): THandle;
var SI: TStartupInfo;
PI : TProcessInformation;
Bool: boolean;
begin
Result := 0;
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
if not Wait then
begin
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := SW_SHOWMINNOACTIVE;
end;
Bool := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0,
nil, PChar(WorkDir), SI, PI);
if Bool then
begin
CloseHandle(PI.hThread);
if Wait then WaitForSingleObject(PI.hProcess, INFINITE);
Result := PI.dwProcessId;
CloseHandle(PI.hProcess)
end;
end;
begin
hProcess := RunAppAndWait('C:\Program Files\MyGate\MyGate.exe', 'C:\Program
Files\MyGate', false);
RunAppAndWait('C:\Program Files\The Bat!\thebat.exe', 'C:\Program Files\The
Bat!', true);
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,false,hProcess),1);
end.
B> И еще, WinExec - API'шная функция (т.е. ее можно юзать "везде") В чем же все-таки
B> проблемма в Cpp?
Delphi 5:
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec('c:\winnt\notepad.exe', SW_SHOW);
end;
Builder 5:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WinExec("c:\\winnt\\notepad.exe", SW_SHOW);
}
Или так:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* CmdLine1;
CmdLine1 = "c:\\winnt\\notepad.exe";
WinExec(CmdLine1, SW_SHOW);
}
Ничего не глючит. Приведи свой код - станет понятней.
PS: Кстати в Delphi можно так:
Bool := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0,
^^^ ^^^^^^^^^^^^^^
nil, PChar(WorkDir), SI, PI);
и так:
Bool := CreateProcess(PChar(CmdLine), nil, nil, nil, false, 0,
^^^^^^^^^^^^^^ ^^^
nil, PChar(WorkDir), SI, PI);
А в Buildere можно только так:
Bool = CreateProcess(CmdLine1, "", NULL, NULL, false, 0,
^^^^^^^^ ^^
NULL, WorkDir, &SI, &PI);
А вот так не запускается CmdLine1:
Bool = CreateProcess("", CmdLine1, NULL, NULL, false, 0,
^^ ^^^^^^^^
NULL, WorkDir, &SI, &PI);
т.е. одна и та же API вызывается по разному?
--
Никогда больше не буду говорить афоризмами. Да, кстати, запишите мою последнюю
фразу