Une référence de membre non statique doit être relative à un objet spécifique c++

Tom R

J'essaie de tester une condition booléenne mais pour une raison quelconque, cela ne me permet même pas d'appeler la fonction dans ma classe de fenêtre. J'ai essayé de créer un objet et d'hériter des fonctions et d'obtenir toujours le même message. il me laissera faire if(Attach::attachProc)Cela renvoie toujours true alors qu'il est censé renvoyer false dans la démo. mais non if(AttachProc()). la source de la classe de fenêtre Windows.cpp

#include "Window.h"
#include "Attach.h"
Window* window = nullptr;
Attach attach;
Window::Window()
{
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    
    switch (msg)
    {
    case WM_CREATE:
    {
        
        //Event fired when the windows will be created
        break;
    }
    case WM_COMMAND:
        switch (LOWORD(wparam))
        {
        case ID_INJECT:
            if (Attach::attachProc())
            {
                MessageBox(0, "injected", "", MB_ICONERROR | MB_OK);
            }
            else
            {
                MessageBox(0, "faile to inject", "", MB_ICONERROR | MB_OK);
            }
        default:
            break;
        }
    case WM_DESTROY:
    {
        window->onDestroy();
        //Event fired when the window will be destroyed
        ::PostQuitMessage(0);
        break;

    }

    default:
        return ::DefWindowProc(hwnd, msg, wparam, lparam);

    }
    return NULL;
}
bool Window::init()
{
    WNDCLASSEX wc;
    wc.cbClsExtra = NULL;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbWndExtra = NULL;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance = NULL;
    wc.lpszClassName = "MyWindowClass";
    wc.lpszMenuName = "";
    wc.style = NULL;
    wc.lpfnWndProc = WndProc;

    if (!::RegisterClassEx(&wc))
        return false;

    if (!window)
        window = this;

   m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "MyWindowClass", "T3chSpl10ts", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT
        , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL);
   //if creation fails return false
   if (!m_hwnd)
       return false;
   b_hwnd = CreateWindow("Button", "Inject",
       WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 20, 20, 100, 30,
       m_hwnd, (HMENU)ID_INJECT, GetModuleHandle(NULL), NULL);

   //show up the window
   ::ShowWindow(m_hwnd, SW_SHOW);
   ::UpdateWindow(m_hwnd);


   //set this flag to indicate that the window is initialized and running
   m_is_run = true;
      return true;
}

bool Window::broadcast()
{
    MSG msg;
    while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    Sleep(0);

    return true;
}

bool Window::release()
{
    //Destroy the window
    if (!::DestroyWindow(m_hwnd))
        return false;
    return true;
}

bool Window::isRun()
{
    return m_is_run;
}

void Window::onDestroy()
{
    m_is_run = false;
}

Window::~Window()
{
}

Fenêtre.h

    #pragma once
#include <Windows.h>
#include "Attach.h"
#define Button 0
#define ID_INJECT 1
class Window : public Attach
{
public:
    Window();
    ~Window();
    bool init();//Initializes the window
    bool broadcast();

    bool isRun();
    bool release();
    virtual void onDestroy();
    //virtual void onCreate();
    //virtual void onUpdate();
    
protected:
    HWND m_hwnd;
    HWND b_hwnd;
    bool m_is_run;
    
};

attacher.h

    #pragma once
#include<Windows.h>
#include<TlHelp32.h>
#include<cstdlib>
#include<iostream>

class Attach
{
public:
    bool attachProc();
    
protected:
    char procName[12]{ "Hi" };
    HANDLE hProc = NULL;
    DWORD pID;
};
template <class datatype>
void wpm(datatype valToWrite, DWORD addressToWrite);
template <class datatype>
datatype rpm(DWORD addressToRead);
Serge Ballesta

Vous essayez d'utiliser des méthodes dans la procédure de fenêtre. Le problème est que la procédure window est une fonction libre, c'est-à-dire qu'elle n'a pas cet objet, mais seulement un HWNDhandle. Vous devez d'abord identifier l' Windowobjet pour lequel la procédure de fenêtre est appelée.

Une méthode courante consiste à SetWindowLongPtrstocker un pointeur vers l'objet C++ dans la mémoire supplémentaire de la fenêtre. Ensuite, vous pouvez l'extraire et l'utiliser en toute sécurité dans la WndProcfonction.

Comment:

  1. réservez d'abord de la mémoire supplémentaire pour la fenêtre :

     wc.cbWndExtra = sizeof(LONG_PTR);
    
  2. passer un pointeur vers l'objet dans le lpParamparamètre de CreateWindowouCreateWindowEx

    m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "MyWindowClass", "T3chSpl10ts",
         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT
         , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, this);
    //if creation fails return false
    if (!m_hwnd)
        return false;
    
  3. stockez le pointeur dans cette mémoire supplémentaire lors du traitement du message WM_CREATEou WM_NCCREATEpour l'utiliser ultérieurement dans WndProc :

     LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
     {
         Window *window = (Window *) GetWindowLongPtr(hwnd, 0);
         CREATESTRUCT* cs;
         ...
         case WM_CREATE:
             cs = (CREATESTRUCT*)lParam;
             ::SetWindowLongPtr(hwnd, 0, (LONG_PTR) cs->lpCreateParams);
             break;
         case WM_COMMAND:
             switch (LOWORD(wparam))
             {
             case ID_INJECT:
                 if (window->attachProc())
                 ...
    

WM_NCCREATEet WM_CREATEsont les premiers messages envoyés à la fenêtre. L'initialisation du pointeur vers l'objet à ce moment permet de l'utiliser dans d'autres messages comme WM_SIZE...

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

La référence à une fonction membre non statique doit être appelée

Erreur C ++: la référence à une fonction membre non statique doit être appelée

C ++ Une référence de membre non statique doit être relative à un objet spécifique

Faire référence à un membre statique d'une classe entraîne "pas un membre statique de la classe"

C # - Comment empêcher une référence d'être prise à un membre de la classe?

Erreur: la référence à la fonction membre non statique doit être appelée (2)

La référence à une fonction membre non statique doit être appelée lors du traitement des rappels à l'intérieur d'une classe

La référence à une fonction membre non statique doit être appelée sur une classe basée sur un modèle

Erreur de mappage: une référence de membre non statique doit être relative à un objet spécifique

Erreur C ++ Une référence de membre non statique doit être relative à un objet spécifique

Comment initialiser un objet avec un membre d'objet privé dont le constructeur mange une référence non-const comme paramètre

Appel d'un objet membre à partir d'un objet, ERREUR: la valeur initiale de la référence à non-const doit être une lvalue

Une erreur de référence de membre non statique dans Array à l'aide de C ++

déclarer une variable constante dans une structure me provoque cette erreur une référence de membre non statique doit être relative à un objet spécifique

J'obtiens une erreur "La référence de membre non statique doit être relative à un objet spécifique" dans un projet DLL C ++

une référence de membre non statique doit être relative à un objet spécifique c ++

Qt une référence de membre non statique doit être relative à un objet spécifique

C ++ est-ce que je référence une fonction ou un membre de données? (la référence à une fonction membre non statique doit être appelée)

comment une "référence de membre non statique doit être relative à un objet spécifique" peut être résolue en accédant à une fonction différente

la référence à une fonction membre non statique doit être appelée error

Erreur étrange "une référence à une fonction membre non statique doit être appelée"

La référence à la fonction membre non statique doit être appelée

Message d'erreur c++17 : "la référence à une fonction membre non statique doit être appelée" lors de l'utilisation d'une macro sur un vecteur

Une référence de membre non statique doit être relative à un objet spécifique

Fonction modèle paramétrique de non-type, erreur : la référence à la fonction membre non statique doit être appelée

Obtenir l'erreur "la référence à la fonction membre non statique doit être appelée"

Une référence C++ à une fonction membre non statique est requise

une référence de membre non statique doit être relative à un objet spécifiqueC/C++(245)

la valeur initiale de la référence à non-const doit être une lvalue, Passer un type d'objet par erreur de référence

TOP liste

chaudétiquette

Archive