2017-12-01 15 views
0

今日、私はwindows.hをちょっと混乱させることにしました。私は少し練習をすることを考えました。これは私が書いたコードですが、頭痛を与えています。GetModuleFileNameExが0を返し、GetLastErrorがオーバーフローエラーを返します。私は間違って何をしていますか?

0を返すので、名前はExecNameに渡されず、GetLastError()で参照した場合のエラーはオーバーフローエラーです。

私は実行可能ファイルの名前を取得するさまざまな方法を試みましたが、常に同じ終了します。

#include <iostream> 
#include <Windows.h> 
#include <Psapi.h> 

TCHAR* ExeToFind = "Discord.exe"; 

BOOL CALLBACK CB_EW(
    _In_ HWND hwnd, 
    _In_ LPARAM lParam 
) 
{ 
    TCHAR ExecName[MAX_PATH]; 
    DWORD ProcesID = NULL; 

    GetWindowThreadProcessId(hwnd, &ProcesID); 
    HANDLE handle = OpenProcess(NULL, false, ProcesID); 
    if (GetModuleFileNameEx(handle, NULL, ExecName, MAX_PATH) == 0) { 
     std::cout << "Error " << GetLastError(); 
     return true; 
    } 

    //GetWindowText(hwnd, ExecName, GetWindowTextLength(hwnd)+1); 
    //GetProcessImageFileName(hwnd, ExecName, MAX_PATH); 


    std::cout << ExecName; 
    if (ExecName == ExeToFind) { 

     std::cout << "Here it is\n"; 
     return false; 
    } 
    else { 
     std::cout << "next\n"; 
     return true; 
    } 
} 


int main() 
{ 
    //HWND hWnd = FindWindow(0,0); 

    EnumWindows(CB_EW, NULL); 

    while (true) { 

    } 
    return 0; 
} 

私は間違っていますか?

+1

を働いていた、アクセス許可の問題でした;'あなたが書くために何を意味するのか、ほぼ確実ではありません。 –

+0

ありがとうございました、気付かれていない、ちょうどそれを変更しましたが、それでも同じ結果に終わります – Myownway

+0

これでOpenProcessの戻り値に対してerrorcheckを追加しました。アクセスが拒否されました – Myownway

答えて

0

それは代わりにOpenProcessのアクセス許可のためのNULLを使用するので、私はMAXIMUM_ALLOWEDを使用し、それは `DWORD ProcesID [はsizeof(DWORD)]

+1

のみXPまたは 'PROCESS_QUERY_LIMITED_INFORMATION'アクセスにPROCESS_QUERY_INFORMATION''で開かれたプロセスハンドルを必要とする代わりに、 'MAXIMUM_ALLOWED'はあなたが必要とするアクセスかを理解する必要がこのアクセスを正確に – RbMm

+0

感謝を聞いて、私は今' PROCESS_QUERY_INFORMATION' – Myownway

+0

'PROCESS_QUERY_INFORMATION'あなたを使用しましたxp/2003のみで使用する必要があります。ビスタの必要性から始める 'PROCESS_QUERY_LIMITED_INFORMATION' – RbMm

関連する問題