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

Anonymous

unregistriert

1

24.03.2005, 16:28

MFC-Dll

Ich habe eine MFC-Dll erstellt und darein ein Dialog erstellt. Wenn ich eine Instanz dieser Klasse mache und den Dialog mit DoModal() anzeigen will, dann gibt es einen Fehler, da HWND=0x00000000 ist. Wie komme ich an den HWND. Die Dll wird von einem ganz normalen MFC-Programm aufgerufen.
Jo

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

2

24.03.2005, 20:30

Ein bisschen Code wäre sehr hilfreich.
Exportierst du alles aus der DLL, was du verwenden willst?

Anonymous

unregistriert

3

24.03.2005, 22:53

Ich exportiere diese:

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
extern "C"
{
    __declspec(dllexport) int Test()
    {
        MessageBox(NULL, "Hallo!", "Hallo", MB_OK);
        return 1;
    }

    __declspec(dllexport) CString* GetEnd()
    {
        return &End;
    }

    __declspec(dllexport) bool Import(CString SourceFile, CString EndFile)
    {
        HpglDlg dlg;
        if (dlg.DoModal()==IDOK)
        {

        }

        return true;
    }
}


HpglDlg ist eine Klasse, von CDialog abgeleitet. Wie gesagt, wenn hier der Befehl dlg.DoModal() aufgerufen wird, dann bekomme ich eine Fehler aus dem oben beschriebnen Grund. Die Funktionen werden richtig exportiert.
Nein, nicht alle Funktionen werden exportiert. Die ganze Klasse HpglDlg wird nicht exportiert.

Anonymous

unregistriert

4

24.03.2005, 23:07

Ich habe gefunden, dass es nicht an HWND liegt. Dies ist normal, dass es 0x00000000 ist. Er bringt beim Aufruf von DoModal() einen Fehler, weil er

C-/C++-Quelltext

1
// return -1 in case of failure to load the dialog template resource

wie der Kommentar zeigt, keine dialog template resource laden kann. Ich kann damit nichts anfangen. Kann mir jemand weiterhelfen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

25.03.2005, 12:41

wie erstellst du deinen dialog!?

Anonymous

unregistriert

6

25.03.2005, 15:46

Ich erstelle den Dialog gar nicht. Muss ich den mir Create explizit erstellen. Ich dachte, dass DoModal() reicht.

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

7

25.03.2005, 16:38

Das Problem könnte die Ressourcen Datei sein.
Wenn du deinen Dialog in deinem DLL Projekt erstellt hast, dann wird dort auch eine Resource.h existieren.
Da du den Dialog aber in deiner Anwendung nutzen willst, musst du die Resourcen Datei dort includieren, da er sonst die Ressourcen nicht finden kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.03.2005, 17:08

zum laden der dialog resource brauchts eine hInstance auf die dll...

wo bzw. wie gibst du die an!?

Anonymous

unregistriert

9

25.03.2005, 19:27

@weigo
Ich lade den Dialog ja von der Dll-Datei aus. Dort ist die resource.h auch includiert. Was hat denn das aufrufende Programm damit zu tun? Ich will ja genau dies erreichen, dass es unabhängig von dem Programm ist, das die Dll aufruft.

@dot
Ich gebe nirgends die hInstance an, ich wüsste auch nicht, wo ich sie angeben soll. Bei dieser MFC-Dll gibt es auch kein DllMain aufruf. (Ich glaub, so heißt die Funktion)

Zusatz:
Beim erstellen von einer MFC-Dll kann man zwischen verschiedenen 3 Typen wählen:
1)Standard-Dll mit verknüpfter Dll
2)Standard-Dll mit gemeins. MFC-Dll verwendet
3)Erweiterung-MFC-Dll

Ich hab hier das zweite gewählt. Ich hab dies gleiche auch mal mit dem ersten Typ probiert. Dort wurde dann der Dialog angezeigt, aber dann beim beenden wird ein benutzerdefinierter Haltepunkt angezeigt, und die Zeile wird im Disasemblierer markiert, obwohl ich die Dll im Debug-Modus laufen lasse. Ich weiß nicht, warum.
Ich hab auch noch den dritten Typ ausprobiert. Dort hat er beim kompilieren gemeint, dass er die konstante IDD_DIALOG1 nicht kennt, obwohl sie definiert wurde. Ich hab den Wert dann nachgeschaut und habe ihn stattdessen eingetragen. Dann hat alles funktioniert, sowohl das laden, als auch das beenden des Dialogs. Jetzt will ich aber trotzdem den konstanten Namen verwenden. Kann mir vielleicht jemand sagen, woran dies liegen könnte.
Weiß jemand eine Antwort, auf die komischen Fehler?

Werbeanzeige