CreateProcess()
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
CreateProcess() - 2011-04-08 20:15:12.603333
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
Ребят, помогите плиз доделать прогу… нужно вставить CreateProcess() в прогу… прога подобие ls в linux с pipe() и fork()…. и еще нужно добавить, чтобы выводило: права доступа… Очень прошу помогите с прогой!!! Заранее спасибо!!!!
#undef UNICODE
#include <windows.h>
#include <stdio.h>
#include <string.h>
void print_space(int count)
{
for (int i=0; i<=count; i++) printf(" ");
}
int process_directory(char *theDir, int& level)
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
char szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;
strncpy_s(szDir, theDir, MAX_PATH);
strncat_s(szDir, "\\*", MAX_PATH);
// Find the first file in the directory.
hFind = FindFirstFile(szDir, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
return dwError;
do
{
// пропускаем каталоги . и ..
if ((strncmp(ffd.cFileName, ".", MAX_PATH) == 0) ||
(strncmp(ffd.cFileName, "..", MAX_PATH) == 0) )
{
if (FindNextFile(hFind, &ffd) != 0) continue;
else break;
}
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
print_space(level);
printf("+--");
printf(" %s <DIR>\n", ffd.cFileName);
level++;
process_directory(ffd.cFileName, level);
}
else
{
print_space(level);
printf("|--");
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
printf(" %s %ld bytes\n", ffd.cFileName, filesize.QuadPart);
}
}
while (FindNextFile(hFind, &ffd) != 0);
level--;
dwError = GetLastError();
FindClose(hFind);
return dwError;
}
int main(int argc, char *argv[])
{
if (argc == 1)
{
printf("wrong run. use program <path>\n");
return 1;
}
int level = 0;
process_directory(argv[1], level);
return 0;
}
|
|
|
RE: CreateProcess() - 2011-04-08 22:29:51.366666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Куда вставить, с какой целью? Сразу после: int main(int argc, char *argv[])
{ Достаточно?
|
|
|
RE: CreateProcess() - 2011-04-11 14:06:51.600000
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
quote:
ORIGINAL: Sunzer Куда вставить, с какой целью? Сразу после: int main(int argc, char *argv[])
{ Достаточно? эмм.. нет не достаточно, я знаю прекрасно, что после int main() вставлять createprocess… я не знаю как реализовать этот createprocess в этой программе, чтобы работало все
|
|
|
RE: CreateProcess() - 2011-04-11 18:10:29.696666
|
|
|
Alianna
Сообщений: 1922
Оценки: 356
Присоединился: 2010-03-02 11:27:12.343333
|
Зачем тут вообще этот CreateProcess?
|
|
|
RE: CreateProcess() - 2011-04-11 18:35:59.466666
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
quote:
ORIGINAL: Alianna Зачем тут вообще этот CreateProcess? ну вот так преподаватель сказал
|
|
|
RE: CreateProcess() - 2011-04-11 18:42:01.836666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Что должна запустить апи CreateProcess ?
|
|
|
RE: CreateProcess() - 2011-04-11 18:49:09.520000
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
quote:
ORIGINAL: Flint_ta Что должна запустить апи CreateProcess ? В общем задача такая: Написать прогу реализующую рекурсивный обход дерева каталогов, с использованием канала (pipe)… для linux есть(но не совсем работает), а вот под винду либо createprocess нужен либо createpipe… в проге должны использоваться CreateProcess FindFirstFile FindNextFile GetFileAttributes
|
|
|
RE: CreateProcess() - 2011-04-12 16:29:35.450000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Если нужно писать под винду, то причём тут линукс? Хорошая задача для лабы. Выкладывай сюда то, что уже написал и задавай конкретные вопросы, будем думать.
|
|
|
RE: CreateProcess() - 2011-04-12 17:44:06.940000
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
#undef UNICODE
#include <windows.h>
#include <stdio.h>
#include <string.h>
void print_space(int count)
{
for (int i=0; i<=count; i++) printf(" ");
}
int process_directory(char *theDir, int& level)
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
char szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;
strncpy_s(szDir, theDir, MAX_PATH);
strncat_s(szDir, "\\*", MAX_PATH);
// Find the first file in the directory.
hFind = FindFirstFile(szDir, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
return dwError;
do
{
// пропускаем каталоги . и ..
if ((strncmp(ffd.cFileName, ".", MAX_PATH) == 0) ||
(strncmp(ffd.cFileName, "..", MAX_PATH) == 0) )
{
if (FindNextFile(hFind, &ffd) != 0) continue;
else break;
}
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
print_space(level);
printf("+--");
printf(" %s <DIR>\n", ffd.cFileName);
level++;
process_directory(ffd.cFileName, level);
}
else
{
print_space(level);
printf("|--");
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
printf(" %s %ld bytes\n", ffd.cFileName, filesize.QuadPart);
}
}
while (FindNextFile(hFind, &ffd) != 0);
level--;
dwError = GetLastError();
FindClose(hFind);
return dwError;
}
int main(int argc, char *argv[])
{
if (argc == 1)
{
printf("wrong run. use program <path>\n");
return 1;
}
int level = 0;
process_directory(argv[1], level);
return 0;
} ну у меня только один вопрос как затащить в этот код CreateProccess! нужно сделать лабу для винды и линукса, вот такие вот пироги)
|
|
|
RE: CreateProcess() - 2011-04-12 18:14:26.970000
|
|
|
svjat32
Сообщений: 12
Оценки: -20
Присоединился: 2011-03-31 23:48:15.883333
|
Да, тяжело тебе будет)
|
|
|
RE: CreateProcess() - 2011-04-12 18:45:17.493333
|
|
|
Klofelin
Сообщений: 68
Оценки: 0
Присоединился: 2010-09-03 20:58:52.116666
|
Sidjey Вас уже несколько раз спросили, что должен делать этот процесс. Если вы сами не знаете, то мы то откуда можем знать? Если все равно что, лишь бы было, то вставьте код, который ниже в начало функции main(). Запустится "Блокнот", пару секунд любуемся и гасим.[sm=bo.gif]
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
if (!CreateProcess(NULL, "Notepad.exe", 0, 0, FALSE, 0, 0, 0, &si, &pi))
return 0;
Sleep(2000);
TerminateProcess(pi.hProcess, 1);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
|
|
|
RE: CreateProcess() - 2011-04-12 18:53:58.883333
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Похоже от тебя требуюется клиент-серверная реализация. С передачей данных через пайпы. Цитирую: Анонимные каналы создаются процессом сервером при помощи функции CreatePipe: BOOL CreatePipe( PHANDLE hReadPipe, // описатель для чтения PHANDLE hWritePipe, // описатель для записи LPSECURITY_ATTRIBUTES lpPipeAttributes, // атрибуты безопасности DWORD nSize // размер канала ); Функция CreatePipe возвращает два описателя (дескриптора) для чтения и записи в канал. После создания канала необходимо передать клиентскому процессу эти дескрипторы (или один из них), что обычно делается с помощью механизма наследования. Для наследования описателя нужно, чтобы дочерний процесс создавался функцией CreateProcess с флагом наследования TRUE. Предварительно нужно создать наследуемые описатели. Это можно, например, сделать путем явной спецификации параметра bInheritHandle структуры SECURITY_ATTRIBUTES при создании канала. Другим способом является создание наследуемого дубликата имеющегося описателя при помощи функции DuplicateHandle и последующая передача его создаваемому процессу через командную строку или каким-либо иным образом. Получив нужный описатель, клиентский процесс, так же как и сервер, может далее взаимодействовать с каналом при помощи функций ReadFile и WriteFile. По окончании работы с каналом оба процесса должны закрыть описатели при помощи функции CloseHandle. Код тебе нужен кроссплатформенный, значит использовать win32 api напрямую нельзя. Тут нужен знаток Си.
|
|
|
RE: CreateProcess() - 2011-04-12 19:03:11.113333
|
|
|
Sidjey
Сообщений: 25
Оценки: 0
Присоединился: 2010-05-20 19:05:36.610000
|
quote:
Похоже от тебя требуюется клиент-серверная реализация. С передачей данных через пайпы. да именно это и надо… я нашел исходник на MSDN там клиент и сервер… вот теперь тогда помогите мне вставить в код FindFirstFile FindNextFile GetFileAttributes исходник
http://msdn.microsoft.com/en-us/library/ms682499(v=VS.85).aspx
|
|
|
RE: CreateProcess() - 2011-04-13 12:46:30.403333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Твоя проблема в том, что ты абсолютно не понимаешь, что делаешь. Ты нашёл (а не сам написал) исходник под линукс, получил "общее представление" и решил, что в 2 счёта это можно переделать под винду. Гуглом пользоваться ты умеешь, это хорошо. Составь для себя алгоритм, напиши его и попробуй реализовать. Удели внимание моментам: 1) что должен делать каждый процесс, 2) как происходит отправка данных процессу о том, что ему нужно делать, 3) как процесс будет возвращать результат работы. Сразу говорю, с наскока такое не напишешь.
|
|
|
RE: CreateProcess() - 2011-04-13 13:07:14.236666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Код тебе нужен кроссплатформенный, значит использовать win32 api напрямую нельзя. Тут нужен знаток Си. Просто юзать дериктиву компиляции под linux и win, юзая пайпы там и там по их правилам
|
|
|
RE: CreateProcess() - 2011-04-13 13:23:44.483333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Щя, подумаю что-нибудь… З.Ы. да не нужен там кросс-платформенный код. Ему надо лабу под винду сделать, по пайпам и многопроцессности.
|
|
|
RE: CreateProcess() - 2011-04-13 19:29:23.916666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Накидал на скорую руку на обеде. Не очень хорошо, не доделано чтение из пайпа, не проверял:
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <vector>
#define APP_MUTEX L"ThisIsSparta"
// Forward declaration
const std::wstring& appPath( void ); // Current app full path
std::wstring extractPath( const std::wstring& fullName ); // Exctact folder path
void RunServer( void ); // Server part
void RunClient( const std::wstring& path ); // Client part
HANDLE CreateChild( const std::wstring& path, HANDLE is, HANDLE os ); // Create child process
void ProcessSearch( const std::wstring& root, const std::wstring& name, bool isFolder ); // Process current search result
void SendPath( const std::wstring& path, bool isFolder ); // Send founded path to output
void WaitForTasksComplete( void ); // Waiting for all processes to stop
// Globals
std::vector< HANDLE > gProcess; // Child processes
// Implementation
int wmain( int argc, wchar_t **argv )
{
SetLastError( 0 );
HANDLE mutex = CreateMutex( NULL, TRUE, APP_MUTEX );
if ( mutex == NULL )
return 1;
if ( GetLastError() != ERROR_ALREADY_EXISTS )
RunServer();
else
{
std::wstring path;
if ( argc == 2 )
path = argv[1]; // Directory to process
RunClient( path );
}
ReleaseMutex( mutex );
CloseHandle( mutex );
return 0;
}
void RunServer( void )
{
BOOL success;
HANDLE iStream;
HANDLE oStream;
success = CreatePipe( &iStream, &oStream, NULL, 0 );
if ( !success )
return ;
ProcessSearch( extractPath( appPath() ), L"", true );
WaitForTasksComplete();
// TODO: output
}
const std::wstring& appPath( void )
{
static std::wstring gAppPath;
if ( gAppPath.empty() )
{
std::vector< wchar_t > path( MAX_PATH );
DWORD len = GetModuleFileName( NULL, &path[0], MAX_PATH );
if ( len > MAX_PATH )
{
path.resize( len );
GetModuleFileName( NULL, &path[0], len );
}
gAppPath = std::wstring( path.begin(), path.end() ).c_str();
}
return gAppPath;
}
std::wstring extractPath( const std::wstring& fullName )
{
DWORD len = GetFullPathName( fullName.c_str(), 0, NULL, NULL );
std::vector< wchar_t > buf( len );
wchar_t *end;
GetFullPathName( fullName.c_str(), len, &buf[0], &end );
buf.resize( end - &buf[0] - 1 );
return std::wstring( buf.begin(), buf.end() ).c_str();
}
void WaitForTasksComplete( void )
{
WaitForMultipleObjects( gProcess.size(), &gProcess[0], TRUE, INFINITE );
for ( size_t i = 0; i < gProcess.size(); i++ )
CloseHandle( gProcess[i] );
}
void ProcessFolders( const std::wstring& path )
{
WIN32_FIND_DATA result = { 0 };
SetLastError( 0 );
HANDLE search = FindFirstFile( path.c_str(), &result );
if ( search == INVALID_HANDLE_VALUE || GetLastError() == ERROR_FILE_NOT_FOUND )
return ;
ProcessSearch( path, result.cFileName, ( result.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY );
while( FindNextFile( search, &result ) )
ProcessSearch( path, result.cFileName, ( result.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY );
}
void ProcessSearch( const std::wstring& root, const std::wstring& name, bool isFolder )
{
if ( name == L"." || name == L".." )
return ;
if ( isFolder )
{
std::wostringstream path;
path << root << L'\\' << name;
HANDLE process = CreateChild( path.str(), GetStdHandle( STD_INPUT_HANDLE ), GetStdHandle( STD_OUTPUT_HANDLE ) );
if ( process )
gProcess.push_back( process );
}
SendPath( name, isFolder );
}
void SendPath( const std::wstring& path, bool isFolder )
{
std::wcout << path << std::endl;
}
HANDLE CreateChild( const std::wstring& path, HANDLE is, HANDLE os )
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof( si );
si.hStdError = os;
si.hStdOutput = os;
si.hStdInput = is;
BOOL success = CreateProcess(
appPath().c_str(),
NULL,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi);
if ( !success )
return NULL;
CloseHandle( pi.hThread );
return pi.hProcess;
}
void RunClient( const std::wstring& path )
{
ProcessFolders( path );
WaitForTasksComplete();
}
|
|
|
RE: CreateProcess() - 2011-04-13 19:37:05.396666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
это ведь не будет работать на linux )
|
|
|
RE: CreateProcess() - 2011-04-14 12:17:07.013333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
И??? Как говориться - читай тему сначала.
|
|
|
RE: CreateProcess() - 2011-04-14 21:07:19.746666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
quote:
И??? Дождемся ответа ТС. Мне интересно как же звучало задание препода в оригинале )
|
|
|
RE: CreateProcess() - 2011-04-15 13:15:30.820000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Я же говорю - читай тему сначала quote:
ORIGINAL: Sidjey В общем задача такая: Написать прогу реализующую рекурсивный обход дерева каталогов, с использованием канала (pipe)… для linux есть(но не совсем работает), а вот под винду либо createprocess нужен либо createpipe… в проге должны использоваться CreateProcess FindFirstFile FindNextFile GetFileAttributes
|
|
|
|
|