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:

Routinen mit Alias aber ohne Export

 
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 03.11.2009, 18:14    Titel: Routinen mit Alias aber ohne Export Antworten mit Zitat

Wofür werden in manchen Programmen Subs oder Funktionen mit einem "Alias" aber nicht mit "Export" versehen?

Bisher weiss ich nur, dass Funktionen/Subs die man in einer DLL verfügbar machen will mit einem Alias UND Export versehen muss.

Nun tauchen aber des öfteren Subs/Funktionen auf, die NUR mit einem Alias deklariert sind... Kann man diese Routinen auch noch irgendwie nachträglich wieder einbinden? (mit dylibsymbol gehts schon mal nicht!)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.11.2009, 18:05    Titel: Antworten mit Zitat

Alias benennt die Funktion nur intern um. D.h. im Code benutzt du ein anderes Symbol für die Funktion, als der Assembler es letzendlich tut. Der Compiler ersetzt das im Regelfall.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
croco97



Anmeldungsdatum: 04.11.2005
Beiträge: 260

BeitragVerfasst am: 04.11.2009, 23:12    Titel: Re: Routinen mit Alias aber ohne Export Antworten mit Zitat

OneCypher hat Folgendes geschrieben:
Wofür werden in manchen Programmen Subs oder Funktionen mit einem "Alias" aber nicht mit "Export" versehen?

Bisher weiss ich nur, dass Funktionen/Subs die man in einer DLL verfügbar machen will mit einem Alias UND Export versehen muss.

Nun tauchen aber des öfteren Subs/Funktionen auf, die NUR mit einem Alias deklariert sind... Kann man diese Routinen auch noch irgendwie nachträglich wieder einbinden? (mit dylibsymbol gehts schon mal nicht!)


Der Alias kommt in die Deklaration der Sub des User-Programms, damit der Linker hinterher weiss, welcher interne Sub-Name zu welcher externen DLL-Funktion gehört.

Das Export kommt in die Definition des Subs. Was das macht, weiss ich ehrlich gesagt nicht genau. Vermute mal, der Compiler mappt die Einsprungadresse irgendwohin, damit der Linker nachher was zum "Anfassen" hat.

Oma kann dir das wie immer erklären zwinkern

VG!

Croco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 05.11.2009, 00:43    Titel: Antworten mit Zitat

Was Alias machen soll ist mir schon ziemlich klar, aber warum bei manchen deklarationen das "Export" am ende fehlt ist mir nicht klar. Nach meinen Erfahrungen können die Funktionen in einer DLL nicht vom hauptprogramm geladen werden wenn sie nicht mit "Export" deklariert sind.

kleines beispiel:

Code:

sub testen alias "mooeep" export
    print "hallo, es funktioniert!!"
end sub

Dim testroutine as sub

testroutine = dylibsymbol(0, "mooeep")

testroutine()
sleep


funktioniert wie es soll, aber:

Code:

sub testen alias "mooeep"
    print "hallo, es funktioniert!!"
end sub

Dim testroutine as sub

testroutine = dylibsymbol(0, "mooeep")

testroutine()
sleep


funktioniert nicht.. das programm stürzt ab weil ein nullpointer auftritt...


Aber dennoch kommt es vor, das manche routinen OHNE export deklariert werden.. aber ich hab keine ahnung was mit denen passiert..


Zuletzt bearbeitet von OneCypher am 05.11.2009, 12:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 05.11.2009, 11:50    Titel: Antworten mit Zitat

Vielleicht bin ich blind, aber ich finde den Unterschied zwischen deinen beiden Quellcodeschnipseln nicht. neutral

Werden die von dir erwähnten Nicht-EXPORT-markierten Funktionen dann auch mit DYLIBSYMBOL eingebunden? Vielleicht werden sie nur intern verwendet und sollen nach außen gar nicht sichtbar werden.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 05.11.2009, 12:21    Titel: Antworten mit Zitat

@nemored: Sorry, die zwischenablage hat geklemmt XD .. habs korrigiert! .. der einzige unterschied ist ein einziges Wort: "Export"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 06.11.2009, 11:22    Titel: Antworten mit Zitat

Ich schätze mal, ohne EXPORT - Zusatz kein Eintrag eines Pointers in die Exporttabelle im PE - Header, also NULL.

Routinen ohne "Export" können natürlich intern (in der Exe oder Dll) genutzt werden.
Ein ALIAS "XYZ" ist nicht notwendig.
_________________
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
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 06.11.2009, 18:49    Titel: Antworten mit Zitat

Exakt so siehts aus, volta!
Das Schlüsselwort Export weist den Compiler an, die Funktion in der .def Datei unter der Gruppe Public aufzuführen - erst dadurch entsteht ein Eintrag in der Exporttabelle.
Der Alias legt lediglich fest, dass du im Programm ein anderes Symbol, anstelle des richtigen Namens der Funktion benutzt. Es tritt ein Nullpointer auf, weil DylibSymbol vom Windowseigenen PE-Loader (GetProcAddress) keinen Zeiger auf die Funktion bekommt - ergo null -, weil ja kein entsprechender Eintrag in der Exporttabelle existiert. Der wird von DylibSymbol einfach an dein Programm weitergegeben, was dann frohen Mutes ein jmp 0 ausführt - Epic Fail.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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