Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запуск другой программы из своей


Автор: ivan219 3.1.2006, 00:37
Мне надо из своего преложения запустить программу калькулятор котрый находится в виндовсе.

Как это зделать.

Автор: Poseidon 3.1.2006, 01:19
Код

ShellExecute(Handle, nil, 'calc.exe', nil,nil, SW_Restore);


Не забудь в uses прописать ShellApi

Автор: ivan219 3.1.2006, 02:30
ОК. Всё работает.

Тогда ещё вопрос может у кого есть иходники этого или другого калькулятора а то в виндовском некоторых функций нехватает.

Автор: FRAGNATIC 3.1.2006, 03:53
ivan219
а ещё CreateProcess()
и WinExec()

Цитата
Тогда ещё вопрос может у кого есть иходники этого или другого калькулятора а то в виндовском некоторых функций нехватает.

правила: один вопрос - один топик
а исходники есть на ya.ru

Автор: ivan219 3.1.2006, 04:19
Ладно калькулятор нашол буду его до делыват чтоб всё было.

CreateProcess()
WinExec()

Можно поподробнее чем отличастся.
И как полностью писать как здесь ShellExecute(Handle, nil, 'calc.exe', nil,nil, SW_Restore); .

Автор: Akella 3.1.2006, 09:35
Цитата(ivan219 @ 3.1.2006, 04:19)
И как полностью писать

В справке есть, на форуме, точно есть, попробуй поискать.

CreateProcess() - этой функцией и нужно создавать процессы (запускать программы).
WinExec() - оставлен для совмнстимости твоей, например, программы, с новыми версиями ОС.

Код

private
     function ExecAndWait(const FileName, Params: ShortString; ArcDir:string; const WinState: Word): boolean; export;
....

function TfmMain.ExecAndWait(const FileName, Params: ShortString; ArcDir:string;
  const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ArcDir),StartInfo,ProcInfo);
  { Ожидаем завершения приложения }
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;



ExecAndWait('rar', 'e -o+ *.rar',Dir, SW_Hide);


Автор: ivan219 25.1.2006, 21:26
Вот вопрос прешолось опять поднять так как уменя нечего невышло мне надо запустить прогу которая находится в определённом месте на диске как это зделать smile

Если можно то поподробнее как эту функцию исползовать CreateProcess()

Автор: bems 25.1.2006, 22:01
BOOL CreateProcess(

LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);

1 и 2й параметры -что исполнять тонкостей я не догоняю, но первый пишу нил, а второй - командная строка (можно с путем и параметрами)
3й и 4й - обычно нил
5й - истина если новый процесс наследует хэндлы от твоего
6й - флажки. я пишу ноль, но можно передать CREATE_SUSPENDED и первичный поток процесса будет замороженым
Добавлено @ 22:11
чтобы разморозить - ResumeThread. можно также задать приоритет.
7й - нил, если ты не создавал для этого процесса особый набор перем. окружения
8й - текущий каталог, если нил - наследуется
9й - структура STARTUPINFO. делается так:

var si:STARTUPINFO;
begin
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
CreateProcess(......................,si,...);

10й - структура PROCESS_INFORMATION В ней получаешь в случае успеха ид-ры потока и процесса и их хэндлы. Если не собираешся ничего с ними делать то хэндлы нужно побыстрее закрыть CloseHandle

Автор: ivan219 26.1.2006, 00:08
Это всё слишком для меня я только наяинаю если можно то попроще.

Мне надо: запустить EXE фаил который лежит в папке и находится вместе с управляющим EXE всё это находится в одной папке, некакого управления просто я в управляющем EXE нажемаю на кнопку и EXE из папки запускается. smile
Добавлено @ 00:20
У меня ошибка smile

Код

procedure TForm1.Button1Click(Sender: TObject);
var si:STARTUPINFO;
begin
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
CreateProcess(nil,nil,nil,nil,false,0,nil,'SMD.EXE',si, PROCESS_INFORMATION);
CloseHandle;
end;

Автор: bems 26.1.2006, 01:17
Код

uses windows;
var pi:PROCESS_INFORMATION;si:STARTUPINFO;
begin
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
if CreateProcess('CMD.EXE',nil,nil,nil,false,0,nil,nil,si,pi) then begin
                                                                                                CloseHandle(pi.hthread);
                                                                                                CloseHandle(pi.hprocess); 
                                                                                                end;

Автор: ivan219 26.1.2006, 02:42
Чтото опять не то прога откомпилилась а фаил неоткрывает smile
Код

procedure TForm1.Button1Click(Sender: TObject);
var pi:PROCESS_INFORMATION;si:STARTUPINFO;
begin
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
if CreateProcess('Cmd.EXE',nil,nil,nil,false,0,nil,nil,si,pi) then begin
CloseHandle(pi.hthread);
CloseHandle(pi.hprocess);
end;
end;

Автор: bems 26.1.2006, 03:23
Ну да, я ж говорю - обычно пишу во втором параметре smile

6: if CreateProcess(nil,'Cmd.EXE',nil,nil,false,0,nil,nil,si,pi) then begin

Автор: ivan219 26.1.2006, 20:16
Код дал bems, всё работает smile

Код

procedure TForm1.Click(Sender: TObject);
var pi:PROCESS_INFORMATION;
si:STARTUPINFO;
err:cardinal;
buf: PChar;
begin
 ZeroMemory(@si,SizeOf(si));
 si.cb:=SizeOf(si);
 if CreateProcess(nil,'Запускаемый фаил.EXE',nil,nil,false,0,nil,nil,si,pi) then 
{Если нужно запустить из папки то нужно писать 'Папка кде лежит EXE\Запускаемый фаил.EXE'}
 begin
 CloseHandle(pi.hthread);
 CloseHandle(pi.hprocess);
 end
 else
 begin
  err:=GetLastError;
  GetMem(buf,255);
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,err,0,buf,255,nil);
  MessageBox(0,buf,'Сообщение',MB_OK);
  freeMem(buf,255);
 end;
end;


smile

Автор: ivan219 28.1.2006, 23:35
Вобщем опять проблема уменя есть фаил который запускается через вот этот код

Код

procedure TForm1.Click(Sender: TObject);    
var pi:PROCESS_INFORMATION;    
si:STARTUPINFO;    
err:cardinal;    
buf: PChar;    
begin    
 ZeroMemory(@si,SizeOf(si));    
 si.cb:=SizeOf(si);    
 if CreateProcess(nil,'Запускаемый фаил.EXE',nil,nil,false,0,nil,nil,si,pi) then    
{Если нужно запустить из папки то нужно писать 'Папка кде лежит EXE\Запускаемый фаил.EXE'}    
 begin    
 CloseHandle(pi.hthread);    
 CloseHandle(pi.hprocess);    
 end    
 else    
 begin    
  err:=GetLastError;    
  GetMem(buf,255);    
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,err,0,buf,255,nil);    
  MessageBox(0,buf,'Сообщение',MB_OK);    
  freeMem(buf,255);    
 end;    
end;


Сам EXE запускается нормально.

Но также есть фаил *.DLL который вместе с EXE но когда я его запускаю через свою прогу то получаю ошибку типа
Код

Access violation at address 00324E6F in module '*.DLL' Write of address 00000012


Если запускать просто без моей проги то всё работает.

Что делать smile

Автор: Fighter 29.1.2006, 02:52
WinExec

Автор: ivan219 29.1.2006, 06:09
Непонял smile

Автор: Guedda 29.1.2006, 14:51
Код

WinExec('calc', SW_SHOWNORMAL);

Автор: ivan219 29.1.2006, 18:48
Всё я проблему решит там надо указывать папку от куда запускать а уменя стоял nil так что всё снова ОК.
Код

 if CreateProcess(nil,'SMD\Smd.EXE',nil,nil,false,0,nil,'smd',si,pi) then {Правильный вариант}

Автор: ivan219 21.9.2006, 13:54
Этот код работает в XP
Код

ShellExecute(Handle, nil, 'calc.exe', nil,nil, SW_Restore);


А в 98 нет что делать smile 

Автор: _hunter 21.9.2006, 14:03
посмотреть на код ошибки. тогда все встанет понятно.
+ что именно не работает -- вообще ShellExecute или запуск ею куркулятора?

Автор: ivan219 21.9.2006, 20:39
Она не запускает калькулятор.

Автор: Alexeis 21.9.2006, 21:47
Какой код ошибки?
Цитата

Return Value

Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.

Автор: ivan219 22.9.2006, 02:01
А там вобще нет ни каких действий ни ошибки ни вызыва калькулятора, в XP нажимаю на кнопку и он появляется а в 98 нечего непроисходит.

Автор: Yanis 22.9.2006, 09:05
Цитата(ivan219 @  22.9.2006,  03:01 Найти цитируемый пост)
А там вобще нет ни каких действий ни ошибки

Поставь этот код сразу после вызова ShellExecute и посмотри какая ошибка:
Код
  ShellExecute();
  ShowMessage(SysErrorMessage(GetLastError));

Автор: ivan219 22.9.2006, 14:55
Код

ShowMessage(SysErrorMessage(GetLastError));


Спасибо уменя нет файла калькулятора smile я же установил всё по минимуму и забыл smile 

Вопрос закрыт smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)