![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Rocket |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Скажите пожалуйста, как создать и уничтожить процесс в ОС семейства Microsoft Windows? Знаю о существовании системного вызова CreateProcess(…), допускающего использование множества дополнительных параметров. Если возможно, то напишите пожалуйста текстовый пример использования CreateProcess(…).
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Вот простейший пример: Шаг 131 - CreateProcess
|
Rocket |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Почему-то у меня не создаётся процесс... И что за библиотека #include "stdafx.h"
? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Что значит "не создается"? Не появляется Notepad? А файл notepad.exe точно лежит там, где указано? У меня запустилось...
Цитата И что за библиотека Если у тебя не VC, можешь убрать эту строку... Это для MFC. |
Rocket |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Что значит "не создается"? Не появляется Notepad? А файл notepad.exe точно лежит там, где указано? У меня запустилось... Если у тебя не VC, можешь убрать эту строку... Это для MFC. Да, не появляется программа, которую хочу запустить. Я запускаю другой exe-шник. И вообще ряд ошибок возникает: 2 In file included from E:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from J:\OsLab3.cpp 2 from J:\OsLab3.cpp 32:2 #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. 4 `main' must return `int' In function `int main(...)': 9 [Warning] passing NULL used for non-pointer converting 6 of `BOOL CreateProcessA(const CHAR*, CHAR*, _SECURITY_ATTRIBUTES*, _SECURITY_ATTRIBUTES*, BOOL, DWORD, void*, const CHAR*, _STARTUPINFOA*, _PROCESS_INFORMATION*)' |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата И вообще ряд ошибок возникает: Ну так сначала исправь ошибки а потом будешь говорить, получается у тебя что-нибудь или нет... Ты ж программу не откомпилировал, что ты хочешь запустить?Вот это компилируется без предупреждений/ошибок, и прекрасно работает: #include <windows.h>
#include <iostream>
using namespace std;
int main()
{
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if (CreateProcess("c:\\windows\\notepad.exe",NULL,
NULL,NULL,FALSE,0,NULL,NULL,& cif,& pi)==TRUE)
{
cout << "process" << endl;
cout << "handle " << pi.hProcess << endl;
Sleep(1000); // подождать
TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс
}
return 0;
}
|
Rocket |
![]()
Сообщение
#7
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Ну так сначала исправь ошибки а потом будешь говорить, получается у тебя что-нибудь или нет... Ты ж программу не откомпилировал, что ты хочешь запустить? Вот это компилируется без предупреждений/ошибок, и прекрасно работает: #include <windows.h>
#include <iostream>
using namespace std;
int main()
{
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if (CreateProcess("c:\\windows\\notepad.exe",NULL,
NULL,NULL,FALSE,0,NULL,NULL,& cif,& pi)==TRUE)
{
cout << "process" << endl;
cout << "handle " << pi.hProcess << endl;
Sleep(1000); // подождать
TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс
}
return 0;
}
Да, действительно работает прекрасно) А вот как реализовать программу, которая запускала бы исполняемые файлы ( файлы с расширениями .exe, .bat, .cmd) из указанного в качестве параметра каталога. После завершения каждого запущенного процесса соответствующий исполняемый файл должен удаляться. В случае, если в указанном каталоге отсутствуют файлы, программа должна ожидать их появления. Учесть, что запуск файлов с расширениями .bat и .cmd может быть осуществлен только с помощью командного процессора cmd.exe. ? |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Искать в папке файлы с необходимыми расширениями (FindFirstFile/FindNextFile), в зависимости от расширения добавлять или нет к командной строке "cmd.exe", и запускать процесс... После запуска процесса ждать его завершения через WaitForSingleObject, а потом удалять файл...
Пробуй, что не получится - поможем ![]() |
Rocket |
![]()
Сообщение
#9
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Искать в папке файлы с необходимыми расширениями (FindFirstFile/FindNextFile), в зависимости от расширения добавлять или нет к командной строке "cmd.exe", и запускать процесс... После запуска процесса ждать его завершения через WaitForSingleObject, а потом удалять файл... Пробуй, что не получится - поможем ![]() А где можно прочитать про эти функции (FindFirstFile/FindNextFile)? в интернете что-то не получается нарыть...а хотелось бы взглянуть на пример использования... |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Тебя что, на MSDN забанили?
![]() MSDN: FindFirstFile Function, там же в списке "See Also" есть и FindNextFile, и FindClose |
Rocket |
![]()
Сообщение
#11
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Тебя что, на MSDN забанили? ![]() MSDN: FindFirstFile Function, там же в списке "See Also" есть и FindNextFile, и FindClose Да тут чёрт голову сломит ![]() Вот что у меня получилось...конечно по большей части скорей не получилось, но всё же :
#include <iostream>
#include <io.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
using namespace std;
void strdel(char *st)
{
for(int i=strlen(st)-1;st[i]!='\\';i--)
st[i]='\0';
}
int main()
{
_finddata_t data;
int x=-1,y;
char maska[]="E:\\abra\\*.exe";
char path[]="E:\\abra\\";
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
while(x==-1)
x=_findfirst(maska,&data);
y=x;
strcat(path,data.name);
cout <<"path: " <<path <<endl;
if(CreateProcess(path,NULL,NULL,NULL,false,0,NULL,NULL,&si,&pi))
{
Sleep(1000);
TerminateProcess(pi.hProcess,NO_ERROR);
cout <<endl;
DeleteFile(maska);
}
strdel(path);
cout <<"path: " <<path <<endl;
while(true)
{
x=_findnext(y,&data);
if(x==0)
{
strcat(path,data.name);
if(CreateProcess(path,NULL,NULL,NULL,false,0,NULL,NULL,&si,&pi))
{
Sleep(1000);
TerminateProcess(pi.hProcess,NO_ERROR);
DeleteFile(maska);
strdel(path);
}
}
}
return 0;
}
То есть я нахожу exe-шники, создаю процесс, но удалить не получается... В задании ещё что-то про командную строку сказано... Помогите пожалуйста довести программу до ума! |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата удалить не получается - это не диагностика... Почему не получается? Что возвращает TerminateProcess? if(CreateProcess(path,NULL,NULL,NULL,false,0,NULL,NULL,& si, & pi))
{
Sleep(1000);
if(!TerminateProcess(pi.hProcess,NO_ERROR))
{
cout << "error code = " << GetLastError() << endl;
}
else cout << "process deleted" << endl;
cout <<endl;
DeleteFile(maska);
}
Что выдает?Сообщение отредактировано: volvo - 14.11.2008 23:00 |
Rocket |
![]()
Сообщение
#13
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
- это не диагностика... Почему не получается? Что возвращает TerminateProcess? if(CreateProcess(path,NULL,NULL,NULL,false,0,NULL,NULL,& si, & pi))
{
Sleep(1000);
if(!TerminateProcess(pi.hProcess,NO_ERROR))
{
cout << "error code = " << GetLastError() << endl;
}
else cout << "process deleted" << endl;
cout <<endl;
DeleteFile(maska);
}
Что выдает?Я не так выразился : не удаляется сам файл из папки. TerminateProcess срабатывает... |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
То же самое (проверку на 0 и печать в этом случае кода ошибки) делай для DeleteFile, результат - в студию; почти все WinAPI функции возвращают 0 в случае неудачи, и код ошибки берется через GetLastError.
Только учти, что при удалении файла есть особые случаи: 1) если файл read-only, то перед удалением надо этот атрибут снять; 2) для удаления файла у тебя должны быть права на удаление этого файла, либо права на удаление потомка для той папки, в которой файл лежит... |
Rocket |
![]()
Сообщение
#15
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
То же самое (проверку на 0 и печать в этом случае кода ошибки) делай для DeleteFile, результат - в студию; почти все WinAPI функции возвращают 0 в случае неудачи, и код ошибки берется через GetLastError. Только учти, что при удалении файла есть особые случаи: 1) если файл read-only, то перед удалением надо этот атрибут снять; 2) для удаления файла у тебя должны быть права на удаление этого файла, либо права на удаление потомка для той папки, в которой файл лежит... Так, номер ошибки : 2 во всех случаях... |
Rocket |
![]()
Сообщение
#16
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Только учти, что при удалении файла есть особые случаи: 1) если файл read-only, то перед удалением надо этот атрибут снять; 2) для удаления файла у тебя должны быть права на удаление этого файла, либо права на удаление потомка для той папки, в которой файл лежит... Как все эти операции проделать? |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Эти операции здесь ни при чем. Ошибка №2 - это ERROR_FILE_NOT_FOUND... Вот кусок программы, которая у меня прекрасно нашла все требуемые файлы и удалила их:
int main()
{
WIN32_FIND_DATA wfd;
char *maska = "G:\\T\\*.txt";
char *path = "G:\\T\\";
HANDLE hf = NULL;
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
if ((hf = FindFirstFile(maska, &wfd)) == INVALID_HANDLE_VALUE)
return 1; // ошибка, нет нужных файлов
do
{
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
char full_name[MAX_PATH];
strcpy(full_name, path);
strcat(full_name, wfd.cFileName);
if(CreateProcess(full_name, NULL, NULL, NULL, false, 0, NULL, NULL,& si,& pi)) {
// ...
}
cout << full_name << endl;
DeleteFile(full_name);
}
} while (FindNextFile(hf, &wfd));
FindClose (hf);
return 0;
}
Добавь туда все, что тебе надо после запуска процесса, должно работать... |
Rocket |
![]()
Сообщение
#18
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Эти операции здесь ни при чем. Ошибка №2 - это ERROR_FILE_NOT_FOUND... Вот кусок программы, которая у меня прекрасно нашла все требуемые файлы и удалила их: int main()
{
WIN32_FIND_DATA wfd;
char *maska = "G:\\T\\*.txt";
char *path = "G:\\T\\";
HANDLE hf = NULL;
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
if ((hf = FindFirstFile(maska, &wfd)) == INVALID_HANDLE_VALUE)
return 1; // ошибка, нет нужных файлов
do
{
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
char full_name[MAX_PATH];
strcpy(full_name, path);
strcat(full_name, wfd.cFileName);
if(CreateProcess(full_name, NULL, NULL, NULL, false, 0, NULL, NULL,& si,& pi)) {
// ...
}
cout << full_name << endl;
DeleteFile(full_name);
}
} while (FindNextFile(hf, &wfd));
FindClose (hf);
return 0;
}
Добавь туда все, что тебе надо после запуска процесса, должно работать...Большое спасибо за помощь, всё отлично работает! ![]() |
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 20:26 |