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:

Functionsaufruf innerhalb einer DLL

 
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
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 15.03.2007, 14:20    Titel: Functionsaufruf innerhalb einer DLL Antworten mit Zitat

Hallo Forum,

kleines Problem mit meiner DLL :

Code:
Function "test1" alias "test1" (byval number as integer) as byte ptr Extern
  dim test as integer
  dim outp as byte ptr
    /'
      hier folgt code
    '/

    test = test2(100)

    return outp
end function

Function "test2" alias "test2" (byval number as integer) as integer Extern
  dim anz as integer
    /'
       hier folgt code
    '/ 
  return anz   
end function


Nun bringt mir der Compiler die Fehlermeldung das die in der ersten Funktion aufgerufene zweite Funktion nicht existiert. Weiß jemand Rat ?

Dank im Voraus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 15.03.2007, 14:32    Titel: Antworten mit Zitat

Ich hab zwar davon nich so richtig Ahnung (und ich weis "Wenn man keine ahnung hat einfach mal Fresse halten") aber probiers doch mal so:
Code:

Function "test2" alias "test2" (byval number as integer) as integer Extern
  dim anz as integer
    /'
       hier folgt code
    '/ 
  return anz   
end function
Function "test1" alias "test1" (byval number as integer) as byte ptr Extern
  dim test as integer
  dim outp as byte ptr
    /'
      hier folgt code
    '/

    test = test2(100)

    return outp
end function


Gruß Caran
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 15.03.2007, 16:26    Titel: Antworten mit Zitat

In der Tat, das Problem an der Geschichte ist, dass der Compiler von Oben nach Unten versucht, dein Programm in Maschinencode zu übersetzen (mit einigen Zwischenschritten, aber das wird jetzt zu kompliziert). Und wenn der Kompiler auf das "test2" stößt, hat er auf gut Deutsch gesagt erstmal keine Ahnung, was das sein soll.

Wenn im Sourcecode erst die Funktion "test2" steht, dann die Funktion "test1", dann weiß der Compiler beim Erreichen besagter Stelle schon, was "test2" ist, nämlich die Funktion, die Du da geschrieben hast.

Generell empfiehlt es sich, Funktionen die man benutzt, ersteinmal zu deklarieren, also dem Compiler quasi eine "Vorabinfo" zu geben, dass es eine Funktion mit diesem Namen und diesen Parametern geben wird. In deinem Falle also einfach vor die erste Zeile noch ein
Code:
Declare Function "test2" alias "test2" (byval number as integer) as integer Extern
einfügen.

MfG
Lutz böse Ifer
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 15.03.2007, 21:48    Titel: Antworten mit Zitat

also hatte ich doch ahnung,hätt ich nich gedacht. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 16.03.2007, 13:10    Titel: Antworten mit Zitat

@Lutzifer
Zitat:
In der Tat, das Problem an der Geschichte ist, dass der Compiler von Oben nach Unten versucht, dein Programm in Maschinencode zu übersetzen (mit einigen Zwischenschritten, aber das wird jetzt zu kompliziert). Und wenn der Kompiler auf das "test2" stößt, hat er auf gut Deutsch gesagt erstmal keine Ahnung, was das sein soll.


Funktionsdeklarationen sind innerhalb einer DLL nicht erlaubt und demzufolge wird das Programm nicht compiliert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 16.03.2007, 14:16    Titel: Antworten mit Zitat

Du solltest Dir das Example MyDll.bas in FreeBasic mal ansehen, die Declarationen der Funktionen werden in einer ".bi" Datei erstellt die dann sowohl bei der compilierung der dll als später auch bei dem Programm mit Include eingebunden wird.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 16.03.2007, 14:28    Titel: Antworten mit Zitat

Warum immer so umständlich es ist auch möglich eine DLL dynamisch zu laden, kleines Beispiel aus der Codereferenz :

Code:
'mydll.dll
'in the DLL the function must be declared as CDECL and export
Function AddNumbers Alias "AddNumbers" ( ByVal operand1 As Integer, ByVal operand2 As Integer ) As Integer Export
   AddNumbers = operand1 + operand2
End Function


Code:
'main program
' create a function pointer, arguments must be the same as in the original function
Dim AddNumbers As Function ( ByVal operand1 As Integer, ByVal operand2 As Integer ) As Integer
Dim hndl As Any Ptr
'
hndl=DyLibLoad("mydll.dll")
' find the proc address (case matters!)
AddNumbers = DyLibSymbol( hndl, "AddNumbers" )
' call it..
Print "1 + 2 ="; AddNumbers( 1, 2 )
DyLibFree hndl
Sleep


Jetzt verstehe ich nur nicht warum eine als EXPORT definierte Funktion nicht innerhalb der DLL durch eine andere Funktion aufgerufen werden kann.
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