Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

killmichnich

unregistriert

1

06.05.2009, 22:41

nachrichtenschleife in dll

Hi Leute,
mich würde mal folgendes interessieren:
Wie kann ich die nachrichtenschleifevon meinem Programm in eine dll schreiben? Ich würd das dann gerne so ähnlich machen wir das glaub ich in der TriBase Engine ist, dass ich nur noch die Funktionen CreateMainWindow() und DoMessageLoop() aufrufen muss. Nur dazu muss ich ja iwie die int WINAPI WinMain() und LRESULT CALLBACK WndProc() in meine dll reinpacken können.
Wie krieg ich das am besten hin?

MfG Killmichnich

PS: Ich kenn mich mit dlls nich all zu gut aus, also bitte nix zu kompliziertes ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.05.2009, 08:16

Re: nachrichtenschleife in dll

Zitat von »"killmichnich"«

Nur dazu muss ich ja iwie die int WINAPI WinMain() und LRESULT CALLBACK WndProc() in meine dll reinpacken können.


Warum?
Du kannst doch in deiner dll einfach eine CreateMainWindow() und DoMessageLoop() Funktion machen. Die WinMain bleibt in der exe (in der dll hilft sie dir nix) und ruft diese Funktionen auf, so wies halt die TriBase auch macht. Die WndProc() is dann natürlich in der dll da das Fenster ja dort erstellt wird...

killmichnich

unregistriert

3

07.05.2009, 17:02

ja dabei hab ich jetzt gleich schon mein erstes problem:

CWindow.cpp|41|error C3867: "CWindow::C_WndProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CWindow::C_WndProc", um einen Zeiger auf den Member zu erstellen.|

CWindow.cpp|41|error C2440: '=': 'LRESULT (__stdcall CWindow::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden|

mein Code sieht bis jetzt erst so aus:
window.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class DLL_EXPORT CWindow
{
    public:
    CWindow();
    ~CWindow();
    bool Create(int xpos, int ypos, int width, int height, string fenstertitel);
    void Move(int xpos, int ypos, int width, int height);

    protected:
    HWND C_Hwnd;
    LRESULT CALLBACK C_WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    char* C_ClassName;
};


window.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "window.h"

CWindow::CWindow()
{
    C_ClassName = "Fenster-Klasse";

}

CWindow::~CWindow()
{


}

LRESULT CALLBACK CWindow::C_WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY: PostQuitMessage(0); break;
        case WM_KEYDOWN:
        {
            switch(wParam)
            {
                case VK_ESCAPE: PostQuitMessage(0); break;
                default: break;
            }
            break;
        }
        default: return DefWindowProc (hwnd, message, wParam, lParam); break;
    }
    return 0;
}


bool CWindow::Create(int xpos, int ypos, int width, int height, string fenstertitel)
{
    WNDCLASSEX wincl;

    wincl.hInstance = GetModuleHandle(NULL);
    wincl.lpszClassName = C_ClassName;
    wincl.lpfnWndProc = C_WndProc;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if(!RegisterClassEx (&wincl))
    {
        MessageBox(NULL, "Fehler beim registrieren der Fensterklasse", "Fehler", MB_OK);
        return false;
    }

    C_Hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           C_ClassName,         /* Classname */
           fenstertitel.c_str(),       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           xpos,       /* Windows decides the position */
           ypos,       /* where the window ends up on the screen */
           width,                 /* The programs width */
           height,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           GetModuleHandle(NULL),       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    if(C_Hwnd==NULL)
    {
        MessageBox(NULL, "Fehler beim erstellen des Fensters", "Fehler", MB_OK);
        return false;
    }

    ShowWindow(C_Hwnd, SW_SHOW);

    return true;
}


was stimmt denn daran nich?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

07.05.2009, 17:12

Ein Methodenzeiger is kein Funktionszeiger. Deine WndProc muss wenn ne statische Methode von CWindow sein...

killmichnich

unregistriert

5

07.05.2009, 17:26

das blick ich wiie nich ganz oO
wie müsste das dann aussehen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

07.05.2009, 17:33

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DLL_EXPORT CWindow 
{ 
public: 
  CWindow(); 
  ~CWindow(); 
  bool Create(int xpos, int ypos, int width, int height, string fenstertitel); 
  void Move(int xpos, int ypos, int width, int height); 

protected: 
  HWND C_Hwnd; 

  // !

  static LRESULT CALLBACK C_WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

  char* C_ClassName; 
};

killmichnich

unregistriert

7

07.05.2009, 17:41

uiii das war ja garnich so schwer :/

ich hab aber leider Gottes gleich ein neues Problem:

wenn ich jetzt in einem anderen Programm die Klasse so aufruf und das Programm öffnen will

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
#include "window.h"

using namespace std;

CWindow Window;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    return 0;
}

kommt dass die dll "MSVCP90.dll" nicht gefunden wurde, und ich hab kp wozu die 1. da is, und 2. ob ichs auch iwie ohne die hinbekomm?

Werbeanzeige