Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 15.03.2007, 14:20 Titel: Functionsaufruf innerhalb einer DLL |
|
|
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 |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 15.03.2007, 14:32 Titel: |
|
|
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 |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 15.03.2007, 16:26 Titel: |
|
|
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 Ifer _________________ Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft. |
|
Nach oben |
|
 |
Caran

Anmeldungsdatum: 11.03.2007 Beiträge: 290 Wohnort: Lörrach
|
Verfasst am: 15.03.2007, 21:48 Titel: |
|
|
also hatte ich doch ahnung,hätt ich nich gedacht.  |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 16.03.2007, 13:10 Titel: |
|
|
@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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 16.03.2007, 14:16 Titel: |
|
|
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 |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 16.03.2007, 14:28 Titel: |
|
|
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 |
|
 |
|