Ir ao conteúdo

C++ o que está errado nessa função


Ir à solução Resolvido por arfneto,

Posts recomendados

  • Solução
Postado
1 hora atrás, Mayrinck Bernardo disse:

se fiz tudo certinho

 

Ah tá!

 

E de onde vem essa conclusão?

 

Está mesmo lendo o que eu escrevo?

1 hora atrás, Mayrinck Bernardo disse:

if (hSnap == INVALID_HANDLE_VALUE)printf("CreateToolhelp32Snapshot error\n\n");

 

Depois de tudo que te expliquei, não acha que poderia ter escrito ao menos 

	printf("CreateToolhelp32Snapshot error: %s\n\n", GetLastError());

Não ficou nem um pouco curioso sobre que erro seria esse?

 

Como já te expliquei, programar com essas API não é nada criativo. É chato. Só preencher formulários representados por estruturas. Só que o resultado é praticamente certo. Essas coisas não dão erro. Se dão não é provavelmente um programa nosso de 10 linhas que vai achar. Muito menos resolver.

 

Mas você tem que ter disciplina e entender os paradigmas. Dois apenas, eu acho. Não sou autoridade no entanto.

 

 

19 horas atrás, arfneto disse:

Entenda que window_thread, como pode imaginar é um... thread. Eu uso nomes assim associados às coisas: é o número do thread que criou a janela. E assim não deve ter módulos associados a ele. E assim não é surpresa que as chamadas falhem. E como você não testa pra ver se elas falharam acaba nisso: um zero.

 

Você não testa nada do que chama. Em especial no caso dessas chamadas a API é um mal negócio: teste TODAS chamadas. E se der erro chame GetLastError() pra ver que m3rd@ foi. E FormatMessage() para ter uma descrição do erro se tiver uma. Em geral dão erro 5 quando dão: falta de privilégios, se me lembro bem.

 

Leu mesmo essa parte? Porque continua fazendo exatamente a mesma coisa?

 

	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, window_thread);

 

Nem mesmo essa bobagem de usar em uma linha só depois de eu ter te mostrado e imagino de você ter visto que vai forçar uma barra de scroll horizontal e sumir com o fim da linha?

 

	HANDLE hSnap = CreateToolhelp32Snapshot
	(
		TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,
		window_thread
	);

Não percebe mesmo a diferença?

 

E agora que está na tela pode voltar a ler o que eu te disse sobre window_thread? Em especial aquela parte em letrinhas mais pretas? 

adicionado 1 minuto depois
1 hora atrás, Mayrinck Bernardo disse:

mas essa função não ajuda

 

Sei. 

 

Rodou o programa --- exatamente como te mostrei --- em sua máquina?

 

Não aprendeu nadinha?

Postado

obrigado @arfneto  sair do 0

#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <psapi.h>

#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;

int CALLBACK agente(HWND, LPARAM);

int main(int argc, char** argv)
{
    DWORD flags = 0;
    int  inherit = 0;
    ACCESS_MASK access = READ_CONTROL;
    HDESK desktop = OpenInputDesktop(flags, inherit, access);
    if (desktop == NULL) return -1;
    EnumDesktopWindows(desktop, agente, 0);
    return 0;
};  // main()

int CALLBACK agente(HWND H, LPARAM P)
{
    char    buffer[512];
    DWORD   pai;
    LPDWORD pId = &pai;
    int n = GetWindowTextLengthA(H);
    char* titulo = (char*)malloc(1 + n);
    GetWindowTextA(H, titulo, 1 + n);
    DWORD   window_thread = GetWindowThreadProcessId(H, pId);
    ACCESS_MASK access =
        PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ;
    HANDLE hProcess = OpenProcess(access, FALSE, pai);
    if (hProcess == NULL) return -1;
    n = GetProcessImageFileNameA(hProcess, buffer, 512);
    if (n <= 0) return -2;
    char* p = buffer;
    for (int i = n; i > 1; i -= 1)
    {
        if (buffer[i] != '\\') continue;
        p = buffer + i + 1;
        break;
    }   // for()
    if (strlen(titulo) > 0) {
        printf("Window thread: %8d\ntitulo: '%s'\npai:%8d\nExe: '%s'\n", window_thread, titulo, pai, p);
        HANDLE hModuleSnap = CreateToolhelp32Snapshot
        (
            TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,
            pai
        );
        if (hModuleSnap == INVALID_HANDLE_VALUE) {
            wprintf(L"Format message failed with 0x%x\n", GetLastError());
        }

        MODULEENTRY32 me32;
        me32.dwSize = sizeof(MODULEENTRY32);

        if (!Module32First(hModuleSnap, &me32))
        {
            CloseHandle(hModuleSnap); 
            return(FALSE);
        }
        _tprintf(TEXT("Mod base address: 0x%08X\n"), (DWORD)me32.modBaseAddr);
        _tprintf(TEXT("Mod base address: %ld\n"), (DWORD)me32.modBaseAddr);
        _tprintf(TEXT("\n"));
        CloseHandle(hModuleSnap);
    }
    free(titulo);
    return 1;
};  // agente()

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!