Kann eine DLL einen DIALOG laden?



  • hab mich jetzt ein mit den beispielen auseinadergesetzt. bin aber noch zu keiner funktionierenden lösung gekommen. das beispiel auf codegure funktioniert bei mir leider auch nicht.
    zu stalin's beispiel hab ich noch folgende fragen, da ich es nicht hingekriegt hab es zu implementieren:

    1. was genau macht bei dir GetBPhoneInstance() und wie sieht die funktion aus? ich hab stattdessen immer hinst eingesetzt, das scheint falsch zu sein 😞

    2. SetinTray() , meine Dialogklasse hat diese Methode garnicht, hast du da selber was verändert? oder liegt es am .Net 2003, ist das etwas anderst?

    3. m_pEventHandler->SetReciever((TTapiCallInterface*)m_pDlg) , was genau wird hier gemacht?

    4. ich hab irgentwo auf msdn hilfeseiten gelesen dieser assertion fail kommt nur bei modalen dialogen vor, von wegen bei mir kommt er aber auch bei nicht modalen dialogen vor. weiter stand da, es rührt daher wenn das host-programm nicht mit mcf programmiert wurde. das kann ich ja nicht wissen, ich hab das host-programm ja nicht gemacht ich hab auch keinen zugriff auf den source-code. ich muss ein plugin schreiben.

    sorry, wenn ich mich evt. blöd anstelle aber ich weiss es nicht besser. vielleicht mach ich etwas grundlegendes falsch. zu faul bin ich nicht, ich hab schon so ziemlich alle beiträge gelesen die mit dll & co zu tun haben, aber ich krieg diesen fehler nicht weg! 😡



  • feisX schrieb:

    hab mich jetzt ein mit den beispielen auseinadergesetzt. bin aber noch zu keiner funktionierenden lösung gekommen. das beispiel auf codegure funktioniert bei mir leider auch nicht.
    zu stalin's beispiel hab ich noch folgende fragen, da ich es nicht hingekriegt hab es zu implementieren:

    1. was genau macht bei dir GetBPhoneInstance() und wie sieht die funktion aus? ich hab stattdessen immer hinst eingesetzt, das scheint falsch zu sein 😞

    Hab ich schon gesagt. Sie gibt mir nur die HINSTANCE von der dllmain-Funktion zurück. Ich speicher die halt in einem Objekt.

    feisX schrieb:

    2. SetinTray() , meine Dialogklasse hat diese Methode garnicht, hast du da selber was verändert? oder liegt es am .Net 2003, ist das etwas anderst?

    3. m_pEventHandler->SetReciever((TTapiCallInterface*)m_pDlg) , was genau wird hier gemacht?

    Brauchst du nicht und hast du nicht, da ich die Funktionen bzw. Klassen selber geschrieben habe. Machs doch mal so:

    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    	// Entfernen Sie dies, wenn Sie lpReserved verwenden
    	UNREFERENCED_PARAMETER(lpReserved);
    
    	if (dwReason == DLL_PROCESS_ATTACH)
    	{
    		TRACE0("YYYY.DLL Initializing!\n");
    
    		// One-Time-Initialisierung der Erweiterungs-DLL
    		if (!AfxInitExtensionModule(YyyyDLL, hInstance))
    			return 0;
    
    		new CDynLinkLibrary(YyyyDLL);
    /*YyyyDLL heißt meine Dll, 
    hier muss der Name deiner Dll rein rein 
    aber das wird ja eh vom Studio alles gemacht, 
    also nicht editieren sondern nur anschließende Zeilen bis einschließlich AfxSetReosurceHandle(...) einfügen.*/
    
    		HINSTANCE hinst = ::AfxGetResourceHandle(); 
    
    		::AfxSetResourceHandle(hInstance); 
    
    		CmcDlg* m_pDlg = new CmcDlg; 
    	         m_pDlg->Create(IDD_DIALOG1); 
    		m_pDlg->ShowWindow(SW_SHOW); 
    
    		::AfxSetResourceHandle(hinst); 
    
    	}
    	else if (dwReason == DLL_PROCESS_DETACH)
    	{
    		TRACE0("YYYY.DLL Terminating!\n");
    		// Bibliothek vor dem Aufruf der Destruktoren schließen
    		AfxTermExtensionModule(YyyyDLL);
    	}
    	return 1;   // OK
    }
    


  • guten morgen 😋

    nee, so ähnlich hab ich das gestern auch noch hingekriegt wie dein zweites beispiel. hab es heut morgen aber trotzdem nochmal 1:1 getestet. der assertion fail kommt trotzdem beim ausführen. das problem wird wohl an einer ganz anderen stelle liegen 😕



  • so sieht der fehler
    aus. kompilieren und linken geht einwandfrei, nur beim ausführen kommt der scheiß. was mir aber augefallen ist, wenn ich mehrmals auf ignore drücke werden die fehlermeldungen geschlossen und der dialog wird geladen.
    ist das vielleicht eine falsche einstellung in der sdk???
    ich habe es mit VC++6 und VS.Net2003 ausprobiert.

    weiss den keiner was da faul ist???



  • Zeig doch mal, was genau bemeckert wird, den ASSERT-Befehl.
    Wenn dort eine Variable geprüft wird, wäre deren Inhalt auch interessant.

    Du schreibst, dass du mehrere Assertions bekommst - mach doch mal eine Liste:
    Was wird mit welchem Kriterium bemeckert? <-> Welchen Wert hat meine Variable an der Stelle?

    Manchmal ist es ganz hilfreich, sich den Callstack raufzuarbeiten und mal in den anderen Funktionen zu suchen, was da nicht passen könnte.

    PS: Sei mir nicht böse, aber die Frage muss sein: Kennst du denn den ASSERT Befehl? Weisst du, wann und warum er eingesetzt wird?



  • Hi!

    also zunächst mal deine letzte Frage. Nein ich hab kein Plan was ein ASSERT befehl ist. Was genau macht er?? Ich bin unerfahren im programmieren, bin jetzt im Praxissemester und hab eine für meine Verhältnisse recht anspruchsvolle Aufgabe erhalten. Die ich lösen werde! Egal wie 😃

    Der 1. Fehler in afxwin1.inl Line26 siht so aus: klicken

    die Code Zeilen sind diese hier:

    _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
    	{ ASSERT(afxCurrentResourceHandle != NULL);
    		return afxCurrentResourceHandle; }
    

    Wenn ich Ignore drücke, sieht der nächste Fehler genauso aus, nur in Line23:

    _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
    	{ ASSERT(afxCurrentInstanceHandle != NULL);
    		return afxCurrentInstanceHandle; }
    

    Der 3. ist ebenfalls in Line23 und der 4. ist in Line29, hier kommt schon der Dialog der Host-Progs:

    _AFXWIN_INLINE void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource)
    	{ ASSERT(hInstResource != NULL); afxCurrentResourceHandle = hInstResource; }
    

    nachdem ich den 4. ignoriere wird auch schon der zweite Dialog um den es sich hier handelt geladen.

    Ich weis nicht was für'n Inhalt in den zu prüfenden Variablen steht, wie finde ich das raus? Und wie prüfe ich den Callstack?



  • oha!
    hab grad rumexperementiert, mein Projekt von debug Modus auf Release gestellt, jetzt kommt nix Fehler, zumindest nicht in meinem Testprogramm. In dem Programm für das ich eigentlich das PlugIn schreibe führt das ganze alledings zum Absturz 😞 (Fehler heißt ja Debug Assertion blabla)
    Liegt es vielleicht darin, das ich im Hauptprog, keine *.lib und auch keine header einbinde? Weil das geht schlecht, kann ich ja nicht machen.
    Mein Hauptprog ist Cubasis, ich hatte schonmal ein Thema dazu erstellt:
    VST Plug-In schreiben, hat jemand Erfahrung mit sowas??



  • Guck da mal hin, das sind die Suchergebnisse nach ASSERT auf der MSDN Seite. http://search.microsoft.com/search/results.aspx?View=msdn&st=a&qu=ASSERT&c=4&s=2

    Aber eine grobe Zusammenfassung auch hier:

    ASSERT ist ein Makro, das nur im Debugmodus etwas macht (im Releasemodus ist es nix) - nämlich prüfen, ob die in den Klammern stehende Bedingung erfüllt ist. Wenn sie nicht erfüllt ist (der Vergleich liefert FALSE), wird eine Meldung ausgegeben, die dem Entwickler folgende Möglichkeiten bietet:

    Abort: Die Ausführung des Programms wird abgebrochen, der Debugger wird beendet.
    Retry: Der Debugger wird ggf. gestartet und das Programm an der Stelle angehalten, wo die Assertion ausgelöst wurde. Damit kann man schön nachschauen, was denn da nun falsch gelaufen ist und warum.
    Ignore: Das Programm soll trotzdem normal weitermachen, das kann unter Umständen böse enden, also Vorsicht in dem Fall.

    Wenn du auf einen ASSERT aufläufst, der nicht von dir ist, dann musst du überlegen, was du falsch gemacht hast und / oder nachprüfen, ob du einen bekannten Fehler in der MFC gefunden hast. Im Team wende dich an den Kollegen, von dem der Code ist, der wird sich hoffentlich was dabei gedacht haben.

    ----------------------------------

    Wofür man ASSERT benutzt: (Meine Meinung!!!)

    - Wenn ein Wert auftritt, der nicht sein sollte, z.B. keine Daten gefunden, NULL-Zeiger, zu grosser Arrayindex.
    - Wenn in einer switch ein Wert auftaucht, der da nicht sein dürfte.
    - (Der ist jetzt wirklich nur ein kleiner Tipp) Als Todo-Markierung im Projekt, wenn du z.B. erstmal deinen Dialog angucken willst, und das Datenladen später machen willst. Dann kannst du statt des Ladens ein

    ASSERT(FALSE);
    

    schreiben und schon wirst du automatisch errinnert, dass du noch etwas vergessen hast. 😃

    ----------------------------------

    Wenn du eine ASSERT-Meldung bekommst ist also eine Situation eingetreten, die fehlerhaft ist. In dem Fall sollte dringend geprüft werden, was da falsch ist. Das Programm sieht oft so aus, als ob trotzdem alles okay ist - das böse Erwachen kommt dann oft an anderer Stelle.

    In deinem Fall würde ich vermuten, dass es Probleme mit der Ressource gibt.

    <Ironie on> Alle Klarheiten beseitigt? <Ironie off> 😃

    PS: Informier dich in dem Zusammenhang mal über VERIFY. Das kann ich leider nicht so gut erklären. Wenn ich noch über eine gute Beschreibung stolpere, werde ich die hier posten.



  • stimmt ja, jetzt erinnere ich mich wo du das sagst, hab das mal in nem buch gelesen. beim release werden die asserts alle entfernt.

    nun der erste fehler wird von dieser zeile verursacht:

    HINSTANCE hinst = ::AfxGetResourceHandle();
    

    meine hinst variable bleibt leer,
    der nächste fehler wird wohl ein folgefehler darauf sein,
    der wird beim erzeugen des dialogs ausgelöst, weil der
    darauf kein handle hat oder so.

    m_pDlg->Create(IDD_DIALOG1);
    

    ich muss jetzt mal guxen warum das AfxGetResourceHandle nicht funktionier, eigentlich hab ich alles richtig gemacht. 😕



  • Ich hab grad mal nach AfxGetResourceHandle in der MSDN gesucht und den folgenden Abschnitt gefunden:

    How do I build an "extension DLL"?

    When you're building a 32-bit extension DLL, define _AFXEXT on the compiler command line. If you look in AFXVER_.H, you'll see that this forces _AFXDLL to also be defined. So an "AFXEXT" DLL is an AFXDLL.

    When _AFXDLL is defined, AfxGetResourceHandle returns a value stored in MFC's global data, which is shared by the .EXE, the extension DLL, and the MFC DLL. The handle returned identifies the module that will be searched first when looking for a resource.
    (See the source code for AfxFindResourceHandle() if you're curious about the order of the search.)

    Strictly speaking, what we need to load a resource is a module handle rather than an instance handle. (Instances share modules—that is, code and resources—but have different data.) A DLL has a module handle that is distinct from the handle of the .EXE.

    You can use ::GetModuleHandle to get the handle for your DLL, then pass it to AfxSetResourceHandle so that your DLL is the first place searched for resources. But note that this removes the .EXE module from modules searched. You'll probably want to save a copy of the handle returned by AfxGetResourceHandle before calling AfxSetResourceHandle, then restore it once you're done loading the DLL resource.
    Charlie Kester, Microsoft Developer Support, MSMFC, 7/19/95

    Ausserdem klingt das Kapitel "Extension DLLs" interessant für dich. Schmöker da mal durch.

    Ich vermute, du hast beim Erstellen der Dll etwas vergessen.


Anmelden zum Antworten