Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2008, 19:39   #1
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию CreateProcess, С++

И снова здрасте. Дело вот какое. Пишу прогу на WinAPI. Процессы значит. Пока что написал програмку, которая просто блокнот открывает. Ну или должна открывать по крайней мере.
Вот код (без описания окна)
Код:
#include <windows.h>
#include "Resources.h"

WCHAR wName[]			=L"Processes";
WCHAR cName[]			=L"Windowsclass";
WCHAR lpszAppName[]		=L"Application";
HINSTANCE hInstance;
HWND hwnd;
HMENU hMenu;
HDC hDC;

static HWND hList = NULL;
static HWND hList2 = NULL;

LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	const int Max = 10;
	STARTUPINFO StartupInfo;
	static int ProcessNumber = 0;
	static PROCESS_INFORMATION ProcessInformation[Max];
	static WCHAR wMyMessage[80];

	switch(msg)
	{
		case WM_PAINT:
			break;
		case WM_CREATE:
			{
				hDC=GetDC(hwnd);
				hMenu=GetSubMenu(GetMenu(hwnd), 0);

				hList  = CreateWindowEx( WS_EX_CLIENTEDGE, L"LISTBOX", L"",
                                       LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL |
                                       WS_CHILD | WS_VISIBLE,
                                       5, 25, 350, 400,
                                       hwnd, NULL,
                                       hInstance, NULL );

				hList2 = CreateWindowEx( WS_EX_CLIENTEDGE, L"LISTBOX", L"",
                                       LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL |
                                       WS_CHILD | WS_VISIBLE,
                                       375, 25, 350, 400,
                                       hwnd, NULL,
                                       hInstance, NULL );
			}
            break;
		case WM_COMMAND :
			{
				switch( LOWORD( wParam ) )
				{
					case ID_EXECUTE:
						{
							if(ProcessNumber<Max)
							{
								StartupInfo.cb			=sizeof(STARTUPINFO);
								StartupInfo.lpReserved	=NULL;
								StartupInfo.lpDesktop	=NULL;
								StartupInfo.lpTitle		=NULL;
								StartupInfo.dwFlags		=STARTF_USESHOWWINDOW;
								StartupInfo.wShowWindow	=SW_SHOWNORMAL;
								StartupInfo.cbReserved2	=0;
								StartupInfo.lpReserved2	=NULL;

								if(CreateProcess(L"NOTEPAD.EXE", 
													L"D:\\Documents and Settings\\Admin\\Мои документы\\Visual Studio 2005\\Projects\\KillCopy.Projects\\Lesson 1\\README.txt",
													NULL, NULL, FALSE,
													0, NULL, NULL, 
													&StartupInfo, 
													&(ProcessInformation[ProcessNumber])))
								{
									ProcessNumber++;
									wsprintf(wMyMessage, 
										L"hProcess is %x\nhThread is %x\ndwProcessId is %x\ndwThreadId is %x.", 
										ProcessInformation[ProcessNumber-1].hProcess,
										ProcessInformation[ProcessNumber-1].hThread,
										ProcessInformation[ProcessNumber-1].dwProcessId,
										ProcessInformation[ProcessNumber-1].dwThreadId);
									MessageBox(hwnd, wMyMessage, L"Process is created", MB_OK);
									EnableMenuItem(hMenu, ID_OTHER_DESTROYPROCESS, MF_BYCOMMAND | MF_ENABLED);
								}
								else
									MessageBox(hwnd, L"Cannot create process", L"Process creation", MB_OK);
							}
							else
								MessageBox(hwnd, L"Too many created processes...", L"ProcessCreation", MB_OK);
						}
                        break;
					case ID_TEST_EXIT:
						{
							PostQuitMessage(0);
							return 0;
						}
						break;
					case ID_OTHER_DESTROYPROCESS:
						{
							if(TerminateProcess(ProcessInformation[ProcessNumber-1].hProcess, 0))
							{
								ProcessNumber--;
								if(!ProcessNumber)
								{
									EnableMenuItem(hMenu, ID_OTHER_DESTROYPROCESS, MF_BYCOMMAND | MF_GRAYED);
								}
								else
									MessageBox(hwnd, L"Cannot terminate process", L"Process termination", MB_OK);
							}
							else
								MessageBox(hwnd, L"No more processes to destroy", L"Process termination", MB_OK);
						}
						break;
				}
			}
			break;
		case WM_DESTROY:
			{
				PostQuitMessage(0);
				return 0;
			}
			break;
	}
	return (DefWindowProc(hwnd, msg, wParam, lParam));
}

//ну тут дальше WNDCLASSEX и так далее...
Проблема в том, что при попытке создать процесс, выскакивает сообщение "Cannot create process". Тоесть он не создается. Вот еще один нюанс - если имя исполняемого файла, для которого создается процесс писать во втором аргументе функции CreateProcess, то есть в lpCommandLine, то при попытке создать процесс вообще вылетает Access Violation, типа память не может быть "written".
Я в ступоре, помогите, кто сталкивался с таким делом. Заранее благодарен.
MaTBeu вне форума Ответить с цитированием
Старый 05.10.2008, 21:20   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

посмотри что возвращает GetLastError и я думаю сам всё поймёшь.
Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Вот еще один нюанс - если имя исполняемого файла, для которого создается процесс писать во втором аргументе функции CreateProcess, то есть в lpCommandLine, то при попытке создать процесс вообще вылетает Access Violation, типа память не может быть "written".
так в принципе и должно быть, ведь имя исполняемого файла не вообще не передаёшь, а только его параметры.

Последний раз редактировалось rpy3uH; 05.10.2008 в 21:22.
rpy3uH вне форума Ответить с цитированием
Старый 05.10.2008, 22:26   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Тээээкс... значит файл не находит. А как мне тогда его указать, если он его не видит в упор?
А по поводу вот этого
Цитата:
так в принципе и должно быть, ведь имя исполняемого файла не вообще не передаёшь, а только его параметры.
Я чет не сильно понял. Во всех книгах написано, что можно первым параметром в CreateProcess писать NULL, а во втором имя файла. А у меня в таком случае AV вылетает.
MaTBeu вне форума Ответить с цитированием
Старый 05.10.2008, 23:39   #4
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Цитата:
if(CreateProcess(L"NOTEPAD.EXE",
L"D:\\Documents and Settings\\Admin\\Мои документы\\Visual Studio 2005\\Projects\\KillCopy.Projects\\ Lesson 1\\README.txt",
NULL, NULL, FALSE,
0, NULL, NULL,
&StartupInfo,
&(ProcessInformation[ProcessNumber])))
полный путь передай к нотепаду
vvviperrr вне форума Ответить с цитированием
Старый 06.10.2008, 11:47   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

100% рабочий пример.
Код:
          STARTUPINFO StartupInfo;
	PROCESS_INFORMATION ProcessInformation;

	StartupInfo.cb=sizeof(STARTUPINFO);
	StartupInfo.lpReserved	=NULL;
	StartupInfo.lpDesktop	=NULL;
	StartupInfo.lpTitle		=NULL;
	StartupInfo.dwFlags		=STARTF_USESHOWWINDOW;
	StartupInfo.wShowWindow	=SW_SHOWNORMAL;
	StartupInfo.cbReserved2	=0;
	StartupInfo.lpReserved2	=NULL;

	if(CreateProcess("C:\\Windows\\System32\\NOTEPAD.EXE", 
		"-o F:\\1.txt", NULL, NULL, FALSE,
		0, NULL, NULL, 
		&StartupInfo, 
		&ProcessInformation)) printf("Hello World!\n");
rpy3uH вне форума Ответить с цитированием
Старый 06.10.2008, 22:56   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Спасибо. Теперь работает. Хотя до полного пути я и так додумался, думал, может есть еще какой способ. Вобщем благодарствую всем, кто принимал участие. Тему можно таво...
MaTBeu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateProcess() параметры Diman4ik Помощь студентам 8 30.01.2008 03:11
CreateProcess (Delphi 7) Alex.rus Помощь студентам 1 06.12.2007 20:12