 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Findus
Anmeldungsdatum: 14.04.2009 Beiträge: 4
|
Verfasst am: 14.04.2009, 00:34 Titel: Frage zur DLL Erstellung |
|
|
Hallo,
ich bin FreeBasic-Neuling und muß sagen, ich finde FreeBasic wirklich klasse. Die Syntax sind verständlich aufgebaut und man kann es wirklich schnell erlernen.
Ich habe die meisten Beispiele nun durchgearbeitet und möchte mich nun an die Erstellung von DLLs wagen.
Meine Frage: Ist es auch möglich, DLLs zu erstellen, die, wenn sie aufgerufen wurden, eigenständig weiterlaufen, bis man sie von extern wieder beendet? Also ohne das das Hauptprogramm nach dem Aufruf warten muß, bis die DLL durchgelaufen ist?
Ich denke da so an eine Art Überwachung. Wenn ein Ereignis eintritt, soll an das Hauptprogramm eine Meldung zurückgeschickt werden.
Ich hoffe, ich habe mich verständlich ausgedrückt.
Gruß
Findus |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 14.04.2009, 11:18 Titel: Re: Frage zur DLL Erstellung |
|
|
Findus hat Folgendes geschrieben: | Meine Frage: Ist es auch möglich, DLLs zu erstellen, die, wenn sie aufgerufen wurden, eigenständig weiterlaufen, .. | ja, machen die sowieso
Zitat: | .. bis man sie von extern wieder beendet? | nur innerhalb des Programms das sie aufgerufen hat.
Zitat: | Also ohne das das Hauptprogramm nach dem Aufruf warten muß, bis die DLL durchgelaufen ist? | nein, wird das Hauptprogramm beendet wird die DLL entladen, also auch beendet. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 14.04.2009, 11:27 Titel: |
|
|
Jain. Generell sind DLL's eigentlich nucr erweiterungen für programme. Ein Programm läd eine DLL um sich zu erweitern. Selbstständig können sie regulär nicht arbeiten.
Unter windows gibt es jedoch die möglichkeit mit (weis grad nicht wie das prog hies, irgend was mit rundll.exe oder so) die DLL zu laden und eine funktion in ihr ausführen zu lassen. Damit kann man quasi eine DLL selbstständig arbeiten lassen.
Eine weitere möglichkeit wäre eine Globale DLL registrierung. Das geht jedoch auch nur unter win, zumindest meinem wissensstand nach.
Dazu musst du die DLL mit "RegisterActiveObject" beim system als Globale DLL für mehrfache nutzung registrieren.
Code: | Public Declare Function CLSIDFromProgID Lib "ole32.dll" (ByVal ProgID As Long, rclsid As Guid) As Long
Public Declare Function RegisterActiveObject Lib "oleaut32.dll" (ByVal pUnk As IUnknown, rclsid As Guid, ByVal dwFlags As Long, pdwRegister As Long) As Long
Public Declare Function RevokeActiveObject Lib "oleaut32.dll" (ByVal dwRegister As Long, ByVal pvReserved As Long) As Long |
Dadurch teilen sich alle programme, welche diese DLL nutzen wollen, die selbe geladene DLL und deren Speicherbereiche. Andernfalls bekommt jedes Programm seinen eigenen DLL-Speicherbereich, was Inteprozesskommunikation unmöglich macht.
Um die registrierung aufzuheben musst du die DLL mit
Code: | Public Declare Function CoDisconnectObject Lib "ole32.dll" (ByVal pUnk As IUnknown, pvReserved As Long) As Long | wieder abmelden.
Entladen wird sie auch erst dann, wenn du die deregistriert hast, oder das letzt eprogramm, das auf sie verweist, beendet wurde. Dabei kann es jedochzu nem crash kommen, wenn du sie vorher nicht abgemeldet hast.
Hast du nun die DLL als Global definiert, kannst du einfach in der DLL mechanissmen vorsehen, die deine ereigniss speicher, bzw weiterleiten.
Idealer weise regestrieren sich dann alle Programme, welche diese DLL einbinden, bei der DLL selbst. Dadurch weis die DLL, welche Programme informationen über änderungen wollen, und kann sie automatisch an das Programm melden.
Aber, das ist ein echt komplexes und tiefgreifendes Thema.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Findus
Anmeldungsdatum: 14.04.2009 Beiträge: 4
|
Verfasst am: 14.04.2009, 12:48 Titel: |
|
|
Danke euch beiden erst mal für eure Antworten.
@Volta
Wenn ich mir die Antwort so durchlese, glaube ich, ich hatte mich doch etwas unglücklich ausgedrückt.
Ich hatte an eine DLL gedacht, die eine recht große Textdatei untersucht, ob bestimmte Wörter in einem Satz vorkommen. Wenn nun die DLL erst die ganze Datei untersucht und mir am Ende Eine Liste mit Zeilennummern ausgibt, kann die Laufzeit der DLL schon einige Zeit dauern.
Jetzt habe ich mir überlegt, ob es vieleicht möglich ist, die DLL so zu programmieren, dass sie in bestimmten Zyklen Teilergebnisse liefert, die das Hauptprogramm bearbeiten kann während die DLL das nächste Teilergebniss sammelt.
Geht so etwas?
@The PuppetMaster
Danke für deine Ausführliche Beschreibung. Die Sache mit der rundll.exe werde ich mir mal anschauen.
Bei der globalen DLL Registrierung sehe ich im Moment nur noch Fragezeichen. Da bin ich als Anfänger glaube ich doch ein bischen überfordert. Aber nochmals Danke für deine Mühe und die recht ausführliche Beschreibung. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 14.04.2009, 13:02 Titel: |
|
|
Hallo!
Findus hat Folgendes geschrieben: | Ich hatte an eine DLL gedacht, die eine recht große Textdatei untersucht, ob bestimmte Wörter in einem Satz vorkommen. Wenn nun die DLL erst die ganze Datei untersucht und mir am Ende Eine Liste mit Zeilennummern ausgibt, kann die Laufzeit der DLL schon einige Zeit dauern.
Jetzt habe ich mir überlegt, ob es vieleicht möglich ist, die DLL so zu programmieren, dass sie in bestimmten Zyklen Teilergebnisse liefert, die das Hauptprogramm bearbeiten kann während die DLL das nächste Teilergebniss sammelt. |
Muss es denn zwangsläufig eine DLL sein? Innerhalb eines FreeBASIC-Programms kann man ohne Weiteres mit mehreren Threads arbeiten, die parallel zueinander ablaufen:
Code: | 'Pseudocode-Ausschnitt
Dim Shared AustauschVariable
StartFunktionImHintergrund UntersuchTextdatei
Do
Print AustauschVariable; "% fertig."
Beep 'Mach in der Zeit Lärm, während die Datei untersucht wird
Sleep 500 '0,5s warten
Loop |
Die Funktion "UntersuchTextdatei" würde parallel zur DO-LOOP-Schleife ablaufen. Mehr zum Thema Threads gibt es in der Befehlsreferenz.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 14.04.2009, 15:19 Titel: |
|
|
achso,
der Vorschlag von Sebastian bringt dir aber nur auf Multiprozessorsystemen (Duo, Quad) Geschwindigkeitsvorteile.
Auf Singleprozessoren kann immer nur ein Programmteil abgearbeitet werden (Timesharing; ein Stückchen Dll dann ein Stückchen Hauptprogramm immer abwechselnd). Die Arbeitszeit bleibt die Zeit(DLL + Hauptprogramm).
("Dll" kanst du auch mit "FunktionImHintergrund" ersetzen) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
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.
|
|