Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск другой программы из своей, Как это зделать 
V
    Опции темы
ivan219
  Дата 3.1.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Мне надо из своего преложения запустить программу калькулятор котрый находится в виндовсе.

Как это зделать.
PM MAIL ICQ   Вверх
Poseidon
Дата 3.1.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Код

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


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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
ivan219
Дата 3.1.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



ОК. Всё работает.

Тогда ещё вопрос может у кого есть иходники этого или другого калькулятора а то в виндовском некоторых функций нехватает.
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 3.1.2006, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: нет
Всего: 11



ivan219
а ещё CreateProcess()
и WinExec()

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

правила: один вопрос - один топик
а исходники есть на ya.ru
PM MAIL   Вверх
ivan219
Дата 3.1.2006, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Ладно калькулятор нашол буду его до делыват чтоб всё было.

CreateProcess()
WinExec()

Можно поподробнее чем отличастся.
И как полностью писать как здесь ShellExecute(Handle, nil, 'calc.exe', nil,nil, SW_Restore); .
PM MAIL ICQ   Вверх
Akella
Дата 3.1.2006, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(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);


PM MAIL   Вверх
ivan219
Дата 25.1.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Вот вопрос прешолось опять поднять так как уменя нечего невышло мне надо запустить прогу которая находится в определённом месте на диске как это зделать smile

Если можно то поподробнее как эту функцию исползовать CreateProcess()
PM MAIL ICQ   Вверх
bems
Дата 25.1.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ivan219
Дата 26.1.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Это всё слишком для меня я только наяинаю если можно то попроще.

Мне надо: запустить 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;

PM MAIL ICQ   Вверх
bems
Дата 26.1.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Код

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;


Это сообщение отредактировал(а) Girder - 30.1.2006, 15:54


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ivan219
Дата 26.1.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Чтото опять не то прога откомпилилась а фаил неоткрывает 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;

PM MAIL ICQ   Вверх
bems
Дата 26.1.2006, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



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

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
ivan219
  Дата 26.1.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Код дал 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 - 26.1.2006, 20:28
PM MAIL ICQ   Вверх
ivan219
Дата 28.1.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: нет
Всего: 12



Вобщем опять проблема уменя есть фаил который запускается через вот этот код

Код

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
PM MAIL ICQ   Вверх
Fighter
Дата 29.1.2006, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



WinExec
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.