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

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

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

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

Qt 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

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

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

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

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

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

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

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)

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

Erreur étrange "une référence à une 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TOP liste

  1. 1

    L'application React Native ne répond pas au démarrage si le débogueur n'est pas connecté

  2. 2

    Liens dynamiques Firebase | Les liens courts ne s'ouvriront pas directement sur mobile

  3. 3

    Comment calculer l'aire de l'intersection de deux cercles ?

  4. 4

    "Le service xxx a une dépendance sur un service inexistant" ce qui ne semble pas vrai?

  5. 5

    Comment définir la couleur de l'intersection dans un diagramme de Venn?

  6. 6

    Fonction de puissance en Java

  7. 7

    mauvaise valeur pour le type long: - Postgresql, Hibernate, Spring

  8. 8

    Lecture à partir de l'API JSON avec C # dans SSIS

  9. 9

    Comment obtenir l'image actuelle dans un flux en direct avec python et opencv ?

  10. 10

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  11. 11

    Comment changer la couleur d'une interface utilisateur lorsqu'elle est survolée

  12. 12

    Changer la connexion / nom d'utilisateur GIT dans IntelliJ IDEA, WebStorm, RubyMine, etc.

  13. 13

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  14. 14

    comment calculer la somme totale et le nombre maximal d'écrans utilisés dans power bi?

  15. 15

    Utilisation du modèle de référentiel lors de l'utilisation des méthodes async / await Asp.NET MVC5 EF

  16. 16

    Comment changer la couleur de fond d'une seule cellule dans un notebook / jupyterlab jupyter?

  17. 17

    Comment écrire une fonction dans postgresql pour obtenir la date de début et la date de fin des mois sur la base du nom du mois qui lui est passé

  18. 18

    L'application Kivy plante: "Ne répond pas"

  19. 19

    Comment résoudre "Erreur fatale PHP: Inconnu: échec de l'ouverture requise"

  20. 20

    Animation CSS - Effet de gonflement

  21. 21

    Comment convertir un nombre int en nombre float ?

chaudétiquette

Archive