Требуется получить идентификатор текущего процесса...Использую функцию 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); // вылет здесь
...
Все-таки не стоило бы приводить DWORD к указателю на строку, и потом все это - еще и к LPARAM... Я бы сделал так:
HWND hIdVal = CreateWindow( ... );
wchar_t pszStrPID[16];
wsprintf(pszStrPID,_T("%d"), GetCurrentProcessId());
SendMessage(hIdVal, WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));
HWND hIdVal = CreateWindow( ... );
wchar_t pszStrPID[16];
wsprintf(pszStrPID,_T("%d"), GetCurrentProcessId());
SendMessage(hIdVal, WM_SETTEXT, 0, (LPARAM)((LPCSTR)lpStrPID));
Это не ошибка, а предупреждение... wsprintf помечено как deprecated, значит, MS не рекомендует больше использовать эту функцию. Я не знаю, что там они рекомендуют для печати в строку, посмотри в MSDN что-ли, я Visual Studio не держу, попробовал на BDS 2009, работает...
Пытаюсь определить дескриптор текущего процесса (используя 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);
Ты получаешь дескриптор мьютекса, а не текущего процесса. Кстати, это код из MSDN, там написано, для чего он применяется... А тебе для чего это понадобилось?
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));
мне требуется определить копию дескриптора текущего процесса с использованием функции OpenProcess ();
Объясните пожалуйста, как это сделать...ведь функция открывает существующий объект по переданному идентификатору..
HANDLE newProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, processID);? Не создаст копию дескриптора процесса?
Ещё один вопросик...по поводу DuplicateHandle()..
Мне нужно использовать её для получения дескриптора текущего процесса...
Не очень понятны некоторые параметры:
DuplicateHandle(GetCurrentProcess(),
?,
GetCurrentProcess(),
?,
0,
FALSE,
DUPLICATE_SAME_ACCESS);
По-моему ты чего-то недоговариваешь... Смотри: что делает 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);
}
volvo попробую объяснить. мы с 18192123 учимся вместе, и проблема это наша общая) лабораторная работа, в первой части которой мы создавали процессы, объединяли их в задание.. а здесь требуется:
if (CreateProcess(NULL,ofn.lpstrFile, NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi))
{
hProcess=pi.hProcess;
AssignProcessToJobObject(hJob,hProcess);
}
svetkom, можно пальцем показать, дубликат ЧЕГО и ГДЕ надо создать? Я в приведенном огрызке кода не вижу ни lab2, ни processID, поэтому ничего сказать не могу... Больше с кусками кода я дела не имею... Это вам не листбокс создать, так можно и систему порушить вплоть до переустановки, с админскими-то правами... Оно мне надо?
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);
}
}
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);
}
Допустим, сдублировала hProcess в dup... Что дальше будешь делать с ним? Что с ним можно сделать такого, чего нельзя сделать напрямую с hProcess?
Чтобы разобраться, что делает DuplicateHandle - см. http://windows-prof.z17.org.ua/zHTML/head03.htm
Получаю псевдодескриптор текущего процесса с помощью 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);