Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Dialog wird nicht angezeigt

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 09.08.2009, 21:16    Titel: Dialog wird nicht angezeigt Antworten mit Zitat

Es geht wieder um meine Portierung der trueSpace SDK nach FB.

Ich hab das "dialogres" Beispiel als Basis für einen Dialog hergenommen der von trueSpace aufgerufen werden soll.

TS ruft dabei eine bestimmte Funktion in meiner DLL auf. Die DLL wiederum ist das PlugIn.

In der Funktion hab ich folgenden Code:

Code:
   DialogBoxParam( GetModuleHandle( NULL ), Cast( LPCSTR, IDD_DLG1 ), NULL, @DlgProc, NULL )

   Beep


Den Beep höre ich, d.h. die Funktion wird ausgeführt. Es kommt auch kein Fehler oder gar Programmabsturz, dennoch sehe ich den Dialog nicht - warum?

Die Ressource ist korrekt eingebunden, die Variablen und IDs sind richtig....Ich komm nicht dahinter.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 09.08.2009, 22:22    Titel: Antworten mit Zitat

Kleiner Nachtrag.

Ich hab den Code jetzt mal so verändert das ich per IF Abfrage mal "nachhake" ob der Dialog überhaupt erstellt wird.

Code:
If DialogBoxParam( GetModuleHandle( NULL ), Cast( LPCSTR, IDD_DLG1 ), NULL, @DlgProc, NULL ) = -1 Then
      Beep
   End If


Siehe da, es peept - warum weis ich jedoch immer noch nicht.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 09.08.2009, 22:56    Titel: Antworten mit Zitat

Wird das Fenster vielleicht versteckt erstellt?
Versuchs mal mit SW_SHOW sichtbar zu machen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 09.08.2009, 23:30    Titel: Antworten mit Zitat

Hab ich schon versucht. Daraufhin kam mir die Idee mit der IF Abfrage um zu überprüfen ob der Dialog denn überhaupt erzeugt wird - was eben nicht der Fall ist.

Ich kann mir nur nicht erklären warum er nicht erstellt wird.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 09.08.2009, 23:35    Titel: Antworten mit Zitat

Das liegt mit ziemlicher Sicherheit an deiner Fenster-Prozedur. (Ich hatte nämlich vor kurzem ein ähnliches Problem und hab Stunden gebraucht, bis ich draufkam, dass die Fensterprozedur schuld war, obwohl diese bis auf ProcPtr(DlgProc) noch nicht vorkam)
Wenn deine Fensterprozedur nämlich z.B. die DefWindowProc / DefDlgProc nicht aufruft, liefert auch CreateDialogParam o.ä. einen Fehler zurück!

Nimm einmal eine wie folgende:
Code:
Function DlgProc(ByVal hWnd As HWND, ByVal uMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As Integer

   Select Case uMsg
      Case WM_DESTROY
         PostQuitMessage(0)
      
   End Select
 
   Return DefWindowProc(hWnd, uMsg, wParam, lParam)

End Function

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 09.08.2009, 23:46    Titel: Antworten mit Zitat

Tja, auch das hab ich schon versucht - leider ohne Erfolg.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 10.08.2009, 02:42    Titel: Antworten mit Zitat

So, ich bin jetzt ein wenig schlauer.

Ich hab mir mal einen originalen C++ PlugIn Quellcode angesehen. Unter jeder exportierten Funktion steht als erstes:

Code:
AFX_MANAGE_STATE( AfxGetStaticModuleState())


Meine Recherchen haben ergeben das dieses C++ eigene makro wohl dazu dient gerade in DLLs die Probleme zu beheben die entstehen wenn man auf Ressoucen (z.B. Dialoge) zurück greifen möchte. (phuh, langer Satz)

Nun stellt sich mir die Frage ob man das ebenfalls irgendwie nach FB migrieren kann?

Diese Makro Geschichte umfasst anscheind selbst schon einige Dateien die sich aber dummerweise so gar nicht durch SWIG durchjagen lassen.

Oder macht das alles am Ende keinen Sinn und man programmiert die Fenster und Controls alle "per Hand"?
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 10.08.2009, 10:02    Titel: Antworten mit Zitat

Zitat:
dieses C++ eigene makro

Falsch! AFX ist eine andere Abkürzung für die MFC und gehört nicht zum C++-Standard. Diese Funktionen sind einfach nur Umschreibungen für weitere WinAPI-Aufrufe.

Code:
#define AFX_MANAGE_STATE(p) _AfxInitManaged(); AFX_MANAGE_STATE_NO_INIT_MANAGED(p)

Code:
__declspec( noinline ) inline int __cdecl  _AfxInitManaged()
{
   return 0;
}
Code:
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState();

Hilft wohl nicht wirklich weiter... :\
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 10.08.2009, 10:57    Titel: Antworten mit Zitat

Nun, danke für die Aufklärung.

Da ich ohnehin keine Ahnung habe was es ist etc. ist es mir eigentlich auch Wurscht lächeln

Wichtig wär mir nur - wie bekomme ich es in FB zum Funktionieren das mein Dialog in der DLL angezeigt wird bzw. das ich die Ressourcen nutzen kann.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 10.08.2009, 22:14    Titel: Antworten mit Zitat

Du hast vermutlich...
a) Child auf True
b) Irgendwas mit den Styles und Exstyles verhunzt. Einfach mal alles abwählen, danach Visible wieder aktivieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 10.08.2009, 22:36    Titel: Antworten mit Zitat

Danke für die Tipps - auch das hab ich schon alles durchgekaut bzw. ausprobiert. Dennoch weigert sich die DLL hartnäckig einen Dialog anzuzeigen der in einer Ressource definiert wurde.

Letzte Nacht hab ich mal was interessantes ausprobiert was meine These stützt. Das Problem ist die Instanz.

GetModuleHandle( Null ) bekommt als Instanz die des rufenden Programms zurück - in meinem Falle TrueSpace, denn mein Dialog ist ja "nur" ein PlugIn bzw. eine DLL.

Lange Rede kurzer Sinn, wenn ich statt der NULL den Namen meiner DLL angebe (z.B. "meinPLugin.dll" ) dann funktioniert mein Dialog plötzlich.

D.h. es liegt "lediglich" daran das man innerhalb der DLL nicht die richtige Instanz bekommt. Dummerweise liegt genau hier der Hase im Pfeffer, denn die AFX Makros machen genau das - sie sorgen dafür das die Anwendung (bzw. DLL) eben weis welche Anwendung sie ist.

Den konkreten Dateinamen zu verwenden könnte man theoretisch zwar machen, wäre aber ziemlich blöd, da man diesen später nie ändern könnte - sonst wäre das PlugIn unbrauchbar.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 11.08.2009, 13:15    Titel: Antworten mit Zitat

So, Problem gelöst. Ich fand die Lösung im englischen Forum.

Das ganze funktioniert so das man mit dieser Funktion hier...

Code:
' dummy function used by VirtualQuery to determine hInstance.
Function hDummy() As Integer
   Return 0
End Function

' Get the module instance for the dll, needed to get the resources of the dll
Function GetModuleInstance() As Integer
     Dim mbi As MEMORY_BASIC_INFORMATION
     VirtualQuery( ProcPtr(hDummy), @mbi, SizeOf(mbi) )
     Return Cast(HANDLE ,mbi.AllocationBase)
End Function


...die Instanz ermitteln kann. Dann klappts auch mit den Resourcen.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 11.08.2009, 19:30    Titel: Antworten mit Zitat

Achso DLL. Ja da hatte ich auch immer Probleme, da musst du natürlich beachten, dass GetModuleHandle(0) die Instanz des PROGRAMMS zurückliefert, und nicht des geladenen Moduls.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 11.08.2009, 19:37    Titel: Antworten mit Zitat

Sag mal....liest du Dir vorhergehende Posts eigentlich durch oder schwafelst du munter drauf los sobald ein Stichwort fällt?
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 11.08.2009, 21:11    Titel: Antworten mit Zitat

Naja ich habe deine Posts nicht gelesen, da ich davon ausging, dass du darin das Problem noch etwas besser/ahnschaulicher beschreibst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 11.08.2009, 21:34    Titel: Antworten mit Zitat

Tja...das solltest du vielleicht mal machen BEVOR du irgendwas hinschreibst. Dann würdest du vielleicht auch helfen - der gute Wille ist ja da - allein es mangelt an der Ausführung.

Nix für ungut.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz