Member 13010616 Ответов: 4

Openprocess() продолжает терпеть неудачу. Почему?


Что бы я ни делал. OpenProcess продолжает возвращать null.

#включить <windows.h>
#include <iostream>
#включить <psapi.h>

использование пространства имен std;
пустая петля(){
DWORD pid;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

если (hProc == NULL){ cout << "не удается открыть процесс.";

LPWSTR path = new WCHAR[MAX_PATH];
DWORD charsCarried = MAX_PATH;
}}
int main(){цикл();}

Что я уже пробовал:

No matter what I do. OpenProcess keeps returning null.

#include <windows.h>
#include <iostream>
#include <psapi.h>

using namespace std;
void loop(){
DWORD pid;
	HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

	if (hProc == NULL){ cout << "Cannot open process.";

	LPWSTR path = new WCHAR[MAX_PATH];
	DWORD charsCarried = MAX_PATH; 
}}
int main(){loop();}

4 Ответов

Рейтинг:
1

Richard MacCutchan

Скорее всего потому, что вы не придали этому значения. pid параметр, так что открывать нечего. Видеть Функция для открытия процесса | Майкрософт документы[^].


Рейтинг:
0

OriginalGriff

Начните с документации: Функция для открытия процесса | Майкрософт документы[^]
Вместо того чтобы просто печатать сообщение "не удается открыть", используйте Функция GetLastError (Windows)[^] чтобы получить информацию о почему? это не удалось. Без этого вы просто догадываетесь, почему!


Рейтинг:
0

Dave Kreskowiak

Возможно, вы также захотите прочитать документацию по PROCESS_ALL_ACCESS, здесь[^].


Рейтинг:
0

Rick York

У мистера Гриффа есть очень хороший совет. Чтобы немного расширить его, вот функция, которую я использую, чтобы помочь с такого рода вещами :

///////////////////////////////////////////////////////////////////////////////

bool GetErrorMsg( DWORD lastError, PTSTR buffer, UINT bufferSize )
{
    PTSTR pmsgbuf = nullptr;
    DWORD msgsize = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                   FORMAT_MESSAGE_FROM_SYSTEM,
                                   nullptr, lastError, LANG_NEUTRAL,
                                   (PTSTR)&pmsgbuf, bufferSize, nullptr );
    if( ! msgsize )
    {
        _stprintf( buffer, _T( "FormatMessage() failed for error code %d" ), lastError );
        return false;
    }

    _tcsncpy( buffer, pmsgbuf, bufferSize-1 );
    LocalFree( (HLOCAL) pmsgbuf );
    PTSTR p = _tcschr( buffer, ch::Return );
    if( *p )
        *p = 0;
    return true;
}

///////////////////////////////////////////////////////////////////////////////

bool GetLastErrorMsg( PTSTR buffer, UINT bufferSize )
{
    DWORD lastError = GetLastError();
    return GetErrorMsg( lastError, buffer, bufferSize );
}
Это позволит получить текстовое представление ошибки, чтобы вы могли распечатать ее или отобразить, или что еще вы хотите с ней сделать. Суть в том, что вы должны выяснить, в чем заключается ошибка, чтобы вы могли ее исправить.


0x01AA

Да, да, конечно, это очень хороший намек, но мистер Маккатчан указал наиболее вероятную причину проблемы :-)

Rick York

Да, это так. Оперативник, скорее всего, нашел бы его сам, если бы показал, в чем состояла ошибка.