Модераторы: 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   Вверх
ivan219
Дата 29.1.2006, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Непонял smile
PM MAIL ICQ   Вверх
Guedda
Дата 29.1.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 3
Всего: 78



Код

WinExec('calc', SW_SHOWNORMAL);



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ivan219
Дата 29.1.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

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


Эксперт
***


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

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



Этот код работает в XP
Код

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


А в 98 нет что делать smile 
PM MAIL ICQ   Вверх
_hunter
Дата 21.9.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ivan219
Дата 21.9.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Она не запускает калькулятор.
PM MAIL ICQ   Вверх
Alexeis
Дата 21.9.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Какой код ошибки?
Цитата

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.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 22.9.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А там вобще нет ни каких действий ни ошибки ни вызыва калькулятора, в XP нажимаю на кнопку и он появляется а в 98 нечего непроисходит.
PM MAIL ICQ   Вверх
Yanis
Дата 22.9.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



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

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



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ivan219
Дата 22.9.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

ShowMessage(SysErrorMessage(GetLastError));


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

Вопрос закрыт smile 
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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