вызов GetModuleFileNameEx через psapi.dll не работает, но почему? - PullRequest
0 голосов
/ 13 июля 2010

Я использую MinGW, который не имеет полной функциональности. например. У него нет поддержки потока wchar_t. Мне удалось обойти это, написав мини-набор манипуляторов (wcusT () в приведенном ниже коде) ... но я обнаружил, что снова сталкиваюсь с GetModuleFileNameEx. Я не был в состоянии запустить GetModuleFileNameEx () Эта функция определена в <psapi.h>, но, похоже, ей не на что ссылаться. Это мой вопрос №1: Может ли / делает / способен ли MinGW запустить GetModuleFileNameEx? Что мне нужно сделать? Я что-то упустил? В качестве обходного пути, я попытался запустить его косвенно через вызов его DLL (psapi.dll), который находится в папке system32 Windows ... но что-то не так. У меня другая ситуация, когда не нужно идти. Буду признателен за любые комментарии по коду ниже .. спасибо

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{ /// typedef and load a dll function
  /// ===============================
  typedef DWORD (__stdcall *foo)(HANDLE, HMODULE, LPTSTR, DWORD);
  LPTSTR  ptcPSAPI_DLL = _T("C:\\WINDOWS\\system32\\psapi.dll");
  HMODULE   hPSAPI_DLL = LoadLibrary(ptcPSAPI_DLL);
  if( !hPSAPI_DLL ) 
  { std::cout<<"ERROR: Failed to load "<<wcusT(ptcPSAPI_DLL)<<std::endl;
    return 1;
  }
  foo GetModFnEx=(foo)GetProcAddress(hPSAPI_DLL,
                  #ifdef  UNICODE
                         "GetModuleFileNameExW");
                  #else
                         "GetModuleFileNameExA");
                  #endif

  /// call the dll library function
  /// =============================
  HWND   hWndNPP = FindWindow(_T("Notepad++"),NULL); // the window calass name
  TCHAR  ytcMFqFn[FILENAME_MAX]; // the buffer for the file name
  DWORD  dwBytes = (GetModFnEx)( hWndNPP, NULL, ytcMFqFn, sizeof(ytcMFqFn) );  
  DWORD  dwError = GetLastError();

  std::cout<<wcusT(_T("hWndNPP  "))<<"="<<hWndNPP        <<"="<<std::endl;
  std::cout<<wcusT(_T("ytcMFqFn "))<<"="<<wcusT(ytcMFqFn)<<"="<<std::endl;
  std::cout<<wcusT(_T("dwBytes  "))<<"="<<dwBytes        <<"="<<std::endl;
  std::cout<<wcusT(_T("dwError  "))<<"="<<dwBytes        <<"="<<std::endl;
  return 0;

  // Output ===============
  // SBCS 
  //   hWndNPP  =0x320606=
  //   ytcMFqFn ==
  //   dwBytes  =0=
  //   dwError  =0=
  // UNICODE
  //   h W n d N P P     =0x320606=
  //   y t c M F q F n   =(☻æ|♀ =
  //   d w B y t e s     =0=
  //   d w E r r o r     =0=
  //  ======================

1 Ответ

5 голосов
/ 13 июля 2010

Ваш неправильный вызов GetModuleFileNameEx

HWND   hWndNPP = FindWindow(_T("Notepad++"),NULL); 
DWORD  dwBytes = (GetModFnEx)( hWndNPP // this is ment to be a process handle, not a HWND
  , NULL, ytcMFqFn, sizeof(ytcMFqFn) );

Документ MSDN на GetModuleFileNameEx

Вы можете попробовать получить дескриптор процесса, используя один из следующих

::GetWindowThreadProcessId(hWnd, &dwProcessID);
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);

// also in PSAPI - EnumProcesses will return an array of app process ids
(BOOL(WINAPI *)(DWORD *,DWORD, DWORD *)) GetProcAddress( psapi, "EnumProcesses" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...