Ir para conteúdo
Fórum Script Brasil
  • 0

MinGW - GNU gcc - Capturar caminho do aplicativo atual


hipnos na area

Pergunta

Estou usando:

  • Sistema: Windows 7 Home Premium - 64bit.
  • Programa de desenvolvimento: Code::Blocks 10.05
  • Compilador: GNU GCC (MinGW).
  • Linguagem: C++
  • O que preciso: Preciso pegar o caminho do aplicativo que o usuário está usando, para monitorar as atividades.

Estou desenvolvendo um sistema de monitoramento de janelas do Windows, tentei usar as seguintes funções:

Windows 2000 = GetModuleFileName()
Windows XP x32 = GetProcessImageFileName()
Windows XP x64 = GetProcessImageFileName()
Windows Vista = QueryFullProcessImageName()
Windows 7 = QueryFullProcessImageName()
Porém com todas ocorrem o mesmo Erro:
main.cpp|19|error: 'QueryFullProcessImageName' was not declared in this scope|
Vejam um exemplo do código que busquei na internet:
#include <Windows.h>
#include <iostream>
#include <Psapi.h>

using namespace std;

void printProcPath(DWORD pid) {
    //HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_QUERY_INFORMATION, false, pid);
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

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

    LPWSTR path = new WCHAR[MAX_PATH];
    DWORD charsCarried = MAX_PATH;
    BOOL iResult = QueryFullProcessImageName(hProc, 0, path, &charsCarried);

    if (iResult == 0) {
        cout << "Cannot get process path.";
        }
    else { 
        wcout << path;
    }
}

int main() {
    DWORD PIDs[1024], bytesReturned, procQty;

    EnumProcesses(PIDs, sizeof(PIDs), &bytesReturned);
    procQty = bytesReturned / sizeof(DWORD);

    for (DWORD i = 0; i < procQty; ++i) {

        cout << PIDs[i] << ": ";
        printProcPath(PIDs[i]);
        cout << '\n';
    }

    cin.get();
    return 0;
}
Outra tentativa foi com esse código que fiz tentando usar GetForegroundWindow: Ele funciona, mas não retorna o caminho do aplicativo que está "FOCADO" ( o que o usuário está usando ), ao invés disso ele retorna o caminho do código compilado. Testem por favor.
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <tlhelp32.h>
#include <cstdio>
#include <psapi.h>

using namespace std;

int main(){
    HWND hwndHandle;
    char janelaGravar[1024];

    while(1){
        Sleep(10);

        //Janela ativa
        hwndHandle = GetForegroundWindow();

        GetWindowText(hwndHandle, janelaGravar, 1023);
        if(hwndHandle){
            HINSTANCE hInstance = (HINSTANCE)GetWindowLong( hwndHandle, GWL_HINSTANCE );
            if(hInstance==0){
                //cout << "Error:" << GetLastError();
            } else {
                TCHAR path[MAX_PATH];
                GetModuleFileName( hInstance, path, MAX_PATH );
                cout << endl << path << endl;
            }
        }
    }
}

Grato.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Boa noite!

Depois eu testo pois não estou no pc agora.

Sobre o erro com QueryFullProcessImageName, provavelmente é porque executável está sendo compilado para o xp. Existe uma forma de criar um arquivo que indica a versão correta do windows para o qual o programa deve ser compilado chamado de manifesto.

Procure sobre isso no code::blocks, deve ter algo lá.

Ou pelo menos inclua um define assim:

#define _WIN32_WINNT 0x600

Esse define deve ser colocado antes de incluir o windows.h.

Veja também esse link, deve te ajudar! :)

http://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx

Link para o comentário
Compartilhar em outros sites

  • 0

O código que você passou funcionou aqui.

Eu tenho o Visual Studio Professional 2010.

Eu criei um novo projeto Win32 Console e escolhi para criar um projeto vazio.

Em seguida eu criei um arquivo chamado main.cpp e colei o código que você passou.

Precisei adicionar a psapi.lib nas dependências e pronto!

Compilou e rodou aqui, exibindo o caminho dos processos em execução.

Link para o comentário
Compartilhar em outros sites

  • 0

Tópico resolvido.

Obrigado Marcelo, mas como disse eu compilo os códigos com MinGW.

----------------

Solução para o Code::Blocks (com MinGW)

  • Vá até settings
  • clique em compiler and debugger
  • vá até linker settings
  • clique em add
  • E digite psapi
Solução por chris: http://stackoverflow.com/users/962089/chris Editado por hipnos na area
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde!

Eu vi que você usa outro ambiente mas, como eu não tenho ele aqui, não tinha como testar com ele.

Assim eu mostrei os passos que eu usei para fazer funcionar no meu ambiente para que você pudesse fazer algo equivalente. B)

O importante é que você conseguiu resolver!

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...