Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Fenster innerhalb von DLL

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.08.2004, 22:56 Uhr
~Dirk
Gast


Hi,

ich habe in der DLLMain ein Fenster erstellt. Dieses wird ordnungsgemäß angezeigt, sobald die Applikation, die DLL lädt.
Wenn ich die Applikation beende bekomme ich nun aber jedes Mal einen Speicherfehler. Was muss ich tun? Muss ich das erstellte Fenster wieder freigeben?

Hier mein Code:


Code:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);


BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    
     //unsichtbares Fenster erstellen
     HWND  hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = (HINSTANCE)hModule ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = "CWindow" ;

     RegisterClass (&wndclass);
  

     hwnd = CreateWindow ("CWindow",// Name der Fensterklasse
                  "Window",          // Fenstertitel
                  WS_OVERLAPPEDWINDOW,                // Fensterstil
                  CW_USEDEFAULT,                      // X-Position des Fensters
                  CW_USEDEFAULT,                      // Y-Position des Fensters
                  CW_USEDEFAULT,                      // Fensterbreite
                  CW_USEDEFAULT,                      // Fensterhöhe
                  NULL,                               // übergeordnetes Fenster
                  NULL,                               // Menü
                  (HINSTANCE)hModule,                 // Programm-Kopiezähler (Programm-ID)
                  NULL) ;                             // zusätzliche Parameter


     ShowWindow (hwnd, SW_SHOWNORMAL) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {    
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{    
     switch (message)
     {    
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}



Vielen Dank schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.08.2004, 08:47 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Versuch mal das nicht in der DllMain, sondern in einer Funktion (z.B. InitWindow oder so) zu machen, die du dann exportierst.

Ansonsten würde ich das Ganze mal debuggen um zu sehen wo genau er hängt...


Wie sieht eigentlich die Anwendung aus die die Dll lädt? Was macht die nach dem Laden?

Ich sehe aber auch den Sinn darin irgendwie nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2004, 14:41 Uhr
~Dirk
Gast


Wenn ich es in einer Funktion InitWindow mache, die ich exportiere, dann muss ja jemand diese Funktion aufrufen. Soll dies die Applikation machen? Und warum? Denn ich möchte, dass das Fenster erzeugt wird, sobald die DLL geladen wird und das das Fenster zerstört wird, wenn die DLL wieder freigegeben wird.

Beim Debuggen lande ich leider nur in in Assemblercode, der auf der rechten Seite ??? stehen hat.

Der Sinn darin ist, dass ich zu dieser DLL Nachrichten via Post- oder SendMessage schicken möchte.

Bei der Anwendung handelt es sich um eine MDI-MFC-Anwendung. Direkt nach dem Laden wird eine View in einem Childfenster angezeigt.

Sorry, dass ich mich erst nach so langer Zeit wieder gemeldet habe, obwohl das Problem akut ist.

Vielen Dank schon mal im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2004, 19:10 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, das Prob ist, DllMain wird auch aufgerufen, wenn du die Lib freigibst. darum hat die dllmain auch eine var "ul_reason_for_call".

Du musst das z.b so machen:


C++:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT InitWindow(HANDLE hModule);


BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    
    switch( ul_reason_for_call) {

    case DLL_PROCESS_ATTACH:  // The DLL is being mapped into the
        DisableThreadLibraryCalls( hModule );
        return InitWindow(hModule);
  break;

    case DLL_PROCESS_DETACH:  // The DLL is being unmapped from the
                              // process address space
        break;

    case DLL_THREAD_ATTACH:  // A thread is being created
        break;

    case DLL_THREAD_DETACH:  // A thread is exiting cleanly
        break;

    default:
        break;
    }
  return 0;
}

LRESULT InitWindow(HANDLE hModule)
{
     //unsichtbares Fenster erstellen
     HWND  hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = (HINSTANCE)hModule ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = "CWindow" ;

     RegisterClass (&wndclass);
  

     hwnd = CreateWindow ("CWindow",// Name der Fensterklasse
                  "Window",          // Fenstertitel
                  WS_OVERLAPPEDWINDOW,                // Fensterstil
                  CW_USEDEFAULT,                      // X-Position des Fensters
                  CW_USEDEFAULT,                      // Y-Position des Fensters
                  CW_USEDEFAULT,                      // Fensterbreite
                  CW_USEDEFAULT,                      // Fensterhöhe
                  NULL,                               // übergeordnetes Fenster
                  NULL,                               // Menü
                  (HINSTANCE)hModule,                 // Programm-Kopiezähler (Programm-ID)
                  NULL) ;                             // zusätzliche Parameter


     ShowWindow (hwnd, SW_SHOWNORMAL) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {    
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{    
     switch (message)
     {    
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


--
class God : public ChuckNorris { };

Dieser Post wurde am 18.08.2004 um 19:10 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2004, 15:01 Uhr
~Dirk
Gast


Vielen Dank für deine Antwort. Das
Code:
DisableThreadLibraryCalls( hModule );
ist nur aus Performancegründen da, nehme ich an.

Noch eine Frage:
Solange das Fenster existiert ist man ja in der while-Schleife gefangen. Muss ich dann die InitWindow Funktion in einen Thread packen, wenn ich parallel zum Fenster anderen Code ausführen möchte?

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2004, 20:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dann ja, wenn du deine ergebnisse in dem fenster dann darstellen willst, würde ich dir empfehlen aus dem fenster heraus deine berechnungen in einem arbeitsthread zu starten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: