Помощь - Поиск - Пользователи - Календарь
Полная версия: Текущий процесс
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Требуется получить идентификатор текущего процесса...Использую функцию 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); // вылет здесь
...

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

    HWND hIdVal = CreateWindow( ... );

wchar_t pszStrPID[16];
wsprintf(pszStrPID,_T("%d"), GetCurrentProcessId());
SendMessage(hIdVal, WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));
18192123
Цитата(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
Что это значит?
volvo
Это не ошибка, а предупреждение... wsprintf помечено как deprecated, значит, MS не рекомендует больше использовать эту функцию. Я не знаю, что там они рекомендуют для печати в строку, посмотри в MSDN что-ли, я Visual Studio не держу, попробовал на BDS 2009, работает...
18192123
Пытаюсь определить дескриптор текущего процесса (используя 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);



Вроде отрабатывает без ошибок и вылетов...И вопрос у меня в том, правильно ли я действую (дескриптор ли текущего процесса получаю)?
volvo
Ты получаешь дескриптор мьютекса, а не текущего процесса. Кстати, это код из MSDN, там написано, для чего он применяется... А тебе для чего это понадобилось?
18192123
Цитата(volvo @ 20.10.2008 23:17) *

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

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

volvo
Цитата
Если я хочу получить дескриптор текущего процесса..
, то кто мешает тебе получить 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));
Вроде бы возвращается именно хэндл процесса:
Нажмите для просмотра прикрепленного файла
18192123
мне требуется определить копию дескриптора текущего процесса с использованием функции OpenProcess ();
Объясните пожалуйста, как это сделать...ведь функция открывает существующий объект по переданному идентификатору..
volvo
Цитата
ведь функция открывает существующий объект по переданному идентификатору
Как ты думаешь, что сделает вот этот вызов, к примеру:
HANDLE newProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, processID);
? Не создаст копию дескриптора процесса?

А вообще, не очень ясна цель производимых тобой махинаций... Поэтому очень трудно догадываться, как можно решить проблему более оптимально (да и вообще, надо ли ее решать).
18192123
Цитата(volvo @ 24.10.2008 22:45) *

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

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


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



И какой из этих параметров будет тем, что мне нужно?
volvo
По-моему ты чего-то недоговариваешь... Смотри: что делает 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? Я не буду этого делать...
svetkom
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?
volvo
svetkom, можно пальцем показать, дубликат ЧЕГО и ГДЕ надо создать? Я в приведенном огрызке кода не вижу ни lab2, ни processID, поэтому ничего сказать не могу... Больше с кусками кода я дела не имею... Это вам не листбокс создать, так можно и систему порушить вплоть до переустановки, с админскими-то правами... Оно мне надо?
svetkom
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 - что это?
volvo
Допустим, сдублировала hProcess в dup... Что дальше будешь делать с ним? Что с ним можно сделать такого, чего нельзя сделать напрямую с hProcess?

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

Цитата
handle - третий параметр в DuplicateHandle - что это?
Я же написал там, это хэндл (неважно чего, любой, который можно дублировать), в контексте чужого процесса processID...
18192123
Получаю псевдодескриптор текущего процесса с помощью 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);

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

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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.