Скажите пожалуйста, как создать и уничтожить процесс в ОС семейства Microsoft Windows? Знаю о существовании системного вызова CreateProcess(…), допускающего использование множества дополнительных параметров. Если возможно, то напишите пожалуйста текстовый пример использования CreateProcess(…).
Вот простейший пример: http://www.firststeps.ru/mfc/winapi/r.php?131
#include "stdafx.h"?
Что значит "не создается"? Не появляется Notepad? А файл notepad.exe точно лежит там, где указано? У меня запустилось...
#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;
}
#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;
}
Искать в папке файлы с необходимыми расширениями (FindFirstFile/FindNextFile), в зависимости от расширения добавлять или нет к командной строке "cmd.exe", и запускать процесс... После запуска процесса ждать его завершения через WaitForSingleObject, а потом удалять файл...
Пробуй, что не получится - поможем
Тебя что, на MSDN забанили?
http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx, там же в списке "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;
}
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);
}
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);
}
То же самое (проверку на 0 и печать в этом случае кода ошибки) делай для DeleteFile, результат - в студию; почти все WinAPI функции возвращают 0 в случае неудачи, и код ошибки берется через GetLastError.
Только учти, что при удалении файла есть особые случаи:
1) если файл read-only, то перед удалением надо этот атрибут снять;
2) для удаления файла у тебя должны быть права на удаление этого файла, либо права на удаление потомка для той папки, в которой файл лежит...
Эти операции здесь ни при чем. Ошибка №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;
}
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;
}