IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Текущий процесс, Visual C++ 2008 EE
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Требуется получить идентификатор текущего процесса...Использую функцию GetCurrentProcessId(void);
В результате - вылет приложения...Объясните пожалуйста, в чём дело?


...
DWORD lpID=GetCurrentProcessId();
HWND hIdVal = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,
(int)(Rect.left+135), (int)(Rect.top+60), (int)(Rect.right- Rect.left-700), 20,
hwnd, NULL, hInstance, NULL);
SendMessage(hIdVal,WM_SETTEXT, 0, (LPARAM)(LPCSTR)lpID); // вылет здесь
...

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Все-таки не стоило бы приводить DWORD к указателю на строку, и потом все это - еще и к LPARAM... Я бы сделал так:

    HWND hIdVal = CreateWindow( ... );

wchar_t pszStrPID[16];
wsprintf(pszStrPID,_T("%d"), GetCurrentProcessId());
SendMessage(hIdVal, WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 20.10.2008 1:00) *


    HWND hIdVal = CreateWindow( ... );

wchar_t pszStrPID[16];
wsprintf(pszStrPID,_T("%d"), GetCurrentProcessId());
SendMessage(hIdVal, WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));


Ошибка -
1>c:\study\lab3\main.cpp(175) : warning C4995: 'wsprintf': name was marked as #pragma deprecated
Что это значит?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Это не ошибка, а предупреждение... wsprintf помечено как deprecated, значит, MS не рекомендует больше использовать эту функцию. Я не знаю, что там они рекомендуют для печати в строку, посмотри в MSDN что-ли, я Visual Studio не держу, попробовал на BDS 2009, работает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Пытаюсь определить дескриптор текущего процесса (используя DuplicateHandle и значение псевдодескриптора)...

Вот что получилось:


HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
HANDLE hMutexDup;

DuplicateHandle(GetCurrentProcess(),
hMutex,
GetCurrentProcess(),
&hMutexDup,
0,
FALSE,
DUPLICATE_SAME_ACCESS);
HWND hDVal = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,
(int)(Rect.left+135), (int)(Rect.top+90), (int)(Rect.right- Rect.left-700), 20,
hwnd, NULL, hInstance, NULL);
wsprintf(pszStrPID,_T("%d"), hMutex);
SendMessage(hDVal,WM_SETTEXT, 0, (LPARAM)(LPCSTR)pszStrPID);



Вроде отрабатывает без ошибок и вылетов...И вопрос у меня в том, правильно ли я действую (дескриптор ли текущего процесса получаю)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ты получаешь дескриптор мьютекса, а не текущего процесса. Кстати, это код из MSDN, там написано, для чего он применяется... А тебе для чего это понадобилось?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 20.10.2008 23:17) *

Ты получаешь дескриптор мьютекса, а не текущего процесса. Кстати, это код из MSDN, там написано, для чего он применяется... А тебе для чего это понадобилось?

Уу..тогда мьютекс мне совсем не нужен?? Если я хочу получить дескриптор текущего процесса..

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
Если я хочу получить дескриптор текущего процесса..
, то кто мешает тебе получить PID этого процесса (в первом посте ты сама показала, как), а потом:

    DWORD PID = GetCurrentProcessId();
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, PID);
wsprintf(lpStrPID, _T("PID = %d, HANDLE = %d\0"), PID, hProc);
SendMessage(hIdVal,WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));
Вроде бы возвращается именно хэндл процесса:
Прикрепленное изображение

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


мне требуется определить копию дескриптора текущего процесса с использованием функции OpenProcess ();
Объясните пожалуйста, как это сделать...ведь функция открывает существующий объект по переданному идентификатору..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
ведь функция открывает существующий объект по переданному идентификатору
Как ты думаешь, что сделает вот этот вызов, к примеру:
HANDLE newProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, processID);
? Не создаст копию дескриптора процесса?

А вообще, не очень ясна цель производимых тобой махинаций... Поэтому очень трудно догадываться, как можно решить проблему более оптимально (да и вообще, надо ли ее решать).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 24.10.2008 22:45) *

А вообще, не очень ясна цель производимых тобой махинаций... Поэтому очень трудно догадываться, как можно решить проблему более оптимально (да и вообще, надо ли ее решать).

Поставлен конкретный ряд заданий, так что более оптимального решения не требуется) Спасибо!!)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Ещё один вопросик...по поводу DuplicateHandle()..
Мне нужно использовать её для получения дескриптора текущего процесса...
Не очень понятны некоторые параметры:


DuplicateHandle(GetCurrentProcess(),
?,
GetCurrentProcess(),
?,
0,
FALSE,
DUPLICATE_SAME_ACCESS);



И какой из этих параметров будет тем, что мне нужно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






По-моему ты чего-то недоговариваешь... Смотри: что делает DuplicateHandle? Она создает для объекта, заданного в контексте одного процесса, новый описатель, корректный в контексте другого процесса. То есть, если у меня есть какой-то чужой процесс processID, и объект handle в его контексте, то я могу сделать так:

    HANDLE hMyProcess = GetCurrentProcess();
hRemProcess = OpenProcess(PROCESS_DUP_HANDLE, NULL, processID);
DWORD dwResult = 0;
if (hRemProcess) {
HANDLE hMyHandle = NULL;
DuplicateHandle(hRemProcess, hMyProcess, handle, &hMyHandle,
NULL, NULL, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
}


, это хотя бы оправдано, я получаю в hMyHandle дубликат хендла, который корректен в контексте моего процесса, и могу, скажем, его закрыть, чего мне нельзя было делать с handle... Что ты хочешь сделать - мне непонятно... Что значит
Цитата
использовать её для получения дескриптора текущего процесса
? Зачем? В том же самом контексте работать, и извращаться с DuplicateHandle? Я не буду этого делать...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский
Реальное имя: света

Репутация: -  0  +


volvo попробую объяснить. мы с 18192123 учимся вместе, и проблема это наша общая) лабораторная работа, в первой части которой мы создавали процессы, объединяли их в задание.. а здесь требуется:
Цитата
Разработать программу, которая
· Определит идентификатор текущего процесса,
используя функцию GetCurrentProcessID()
· Определит псевдодескриптор текущего процесса,
используя функцию GetCurrentProcess()
· Определит дескриптор текущего процесса, используя
функцию DuplicateHandle() и значение
псевдодескриптора
· Определит копию дескриптора текущего процесса,
используя функцию OpenProcess()


то есть извращения с duplicatehandle производятся из чисто спортивного интереса.
а в продолжение вопроса: имело место такое:

if (CreateProcess(NULL,ofn.lpstrFile, NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi))
{
hProcess=pi.hProcess;
AssignProcessToJobObject(hJob,hProcess);
}


процесс lab2 запускает другой процесс, имя которого получаю из OpenDialog.
пользуясь твоей терминологией: можем ли мы считать созданный процесс чужим по отношению к lab2? то есть так: запущен процесс lab2 и процесс processID, и требуется с помощью функции duplicatehandle создать описатель для processID,корректный в контексте lab2... я правильно вас поняла? если правильно,то по моему processID это hProcess?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






svetkom, можно пальцем показать, дубликат ЧЕГО и ГДЕ надо создать? Я в приведенном огрызке кода не вижу ни lab2, ни processID, поэтому ничего сказать не могу... Больше с кусками кода я дела не имею... Это вам не листбокс создать, так можно и систему порушить вплоть до переустановки, с админскими-то правами... Оно мне надо?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский
Реальное имя: света

Репутация: -  0  +


volvo, извиняюс.. попробую еще раз. значит, на форме есть кнопка, по нажатию на которую происходит создание процесса и присоединение его к заданию:

void OnClickButCreateProc(HWND hwnd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
OPENFILENAME ofn;
TCHAR szFileName[260];
TCHAR szBuf[20];
LPCWSTR lpFilter=TEXT("Executive\0*.EXE\0");
int nError;
BOOL bRes;


ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);

ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME) ;
ofn.hwndOwner=hWndMain;
ofn.hInstance=NULL;
ofn.lpstrFile = szFileName;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFileName);
ofn.lpstrFilter = lpFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

if (GetOpenFileName(&ofn))
{
if (CreateProcess(NULL,ofn.lpstrFile, NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi))
{
hProcess=pi.hProcess; // дескриптор созданного процесса. его будем дублировать.
AssignProcessToJobObject(hJob,hProcess);
if (IsProcessInJob(hProcess,hJob,&bRes))
{
if (!bRes)
{MessageBox(hWndMain,_ultow(GetLastError(),szBuf,16),TEXT("Ошибка"),MB_OK|MB_ICONERROR);}
else {
HANDLE dup; //сюда дублируем
DWORD nLab2ID=GetCurrentProcessID();//ID процесса, из которого создали hProcess
HANDLE lab2=OpenProcess(PROCESS_ALL_ACCESS,TRUE,nLab2ID); //его же дескриптор
DuplicateHandle(hProcess,
lab2,
GetCurrentProcess(),
&dup,
NULL,
NULL,
DUPLICATE_CLOSE_SOURCE| DUPLICATE_SAME_ACCESS);
_ultow((unsigned long)dup,szBuf,10);
SendMessage(hProcDsc,WM_SETTEXT, 0, (LPARAM)(LPCSTR)szBuf);
}

}
else MessageBox(hWndMain,_ultow(GetLastError(),szBuf,16),TEXT("Ошибка"),MB_OK|MB_ICONERROR);

}
else MessageBox(hWndMain,_ultow(GetLastError(),szBuf,16),TEXT("Ошибка"),MB_OK|MB_ICONERROR);

}
else {
nError=CommDlgExtendedError();
if (nError) MessageBox(hWndMain,_ultow(nError,szBuf,16),TEXT("Ошибка"),MB_OK|MB_ICONERROR);
}

}




вот это имелось ввиду.. не думала что все так серьезно, насчет порушения системы..

Добавлено через 14 мин.
и еще вопрос. вот тут

Цитата


 HANDLE hMyProcess = GetCurrentProcess();
hRemProcess = OpenProcess(PROCESS_DUP_HANDLE, NULL, processID);
DWORD dwResult = 0;
if (hRemProcess) {
HANDLE hMyHandle = NULL;
DuplicateHandle(hRemProcess, hMyProcess, handle, &hMyHandle,
NULL, NULL, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
}




handle - третий параметр в DuplicateHandle - что это?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Допустим, сдублировала hProcess в dup... Что дальше будешь делать с ним? Что с ним можно сделать такого, чего нельзя сделать напрямую с hProcess?

Чтобы разобраться, что делает DuplicateHandle - см. 3-ю главу Рихтера

Цитата
handle - третий параметр в DuplicateHandle - что это?
Я же написал там, это хэндл (неважно чего, любой, который можно дублировать), в контексте чужого процесса processID...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Получаю псевдодескриптор текущего процесса с помощью GetCurrentProcess()... и всегда это -1...
Такое вообще может быть??


HWND hPSdVal = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,
(int)(Rect.left+135), (int)(Rect.top+140), (int)(Rect.right- Rect.left-700), 20,
hwnd, NULL, hInstance, NULL);
wsprintf(pszStrPID,_T("%d"), (GetCurrentProcess()));
SendMessage(hPSdVal,WM_SETTEXT, 0, (LPARAM)(LPCSTR)pszStrPID);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Цитата
Такое вообще может быть??
Может... Больше того, так должно быть:

MSDN: GetCurrentProcess Function
Цитата
Remarks

A pseudo handle is a special constant, currently (HANDLE)-1, that is interpreted as the current process handle. For compatibility with future operating systems, it is best to call GetCurrentProcess instead of hard-coding this constant value. The calling process can use a pseudo handle to specify its own process whenever a process handle is required. Pseudo handles are not inherited by child processes.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2021 21:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name