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:

Frage zur DLL Erstellung

 
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
Findus



Anmeldungsdatum: 14.04.2009
Beiträge: 4

BeitragVerfasst am: 14.04.2009, 00:34    Titel: Frage zur DLL Erstellung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 14.04.2009, 11:18    Titel: Re: Frage zur DLL Erstellung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 14.04.2009, 11:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Findus



Anmeldungsdatum: 14.04.2009
Beiträge: 4

BeitragVerfasst am: 14.04.2009, 12:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 14.04.2009, 13:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 14.04.2009, 15:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht 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