Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.08.2009, 21:16 Titel: Dialog wird nicht angezeigt |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.08.2009, 22:22 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 09.08.2009, 22:56 Titel: |
|
|
Wird das Fenster vielleicht versteckt erstellt?
Versuchs mal mit SW_SHOW sichtbar zu machen. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.08.2009, 23:30 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 09.08.2009, 23:35 Titel: |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.08.2009, 23:46 Titel: |
|
|
Tja, auch das hab ich schon versucht - leider ohne Erfolg. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 10.08.2009, 02:42 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 10.08.2009, 10:02 Titel: |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 10.08.2009, 10:57 Titel: |
|
|
Nun, danke für die Aufklärung.
Da ich ohnehin keine Ahnung habe was es ist etc. ist es mir eigentlich auch Wurscht
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 10.08.2009, 22:14 Titel: |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 10.08.2009, 22:36 Titel: |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 11.08.2009, 13:15 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 11.08.2009, 19:30 Titel: |
|
|
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 |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 11.08.2009, 19:37 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 11.08.2009, 21:11 Titel: |
|
|
Naja ich habe deine Posts nicht gelesen, da ich davon ausging, dass du darin das Problem noch etwas besser/ahnschaulicher beschreibst. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 11.08.2009, 21:34 Titel: |
|
|
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 |
|
 |
|