Seite 1 von 2

Hilfe für dll umsetzen.

Verfasst: 20.06.2010 09:18
von super_castle
Hallo, wer kann mir mal helfen diese 3 dll von freebasic umzusetzen in Purebasic-Syntax?
Die Muster möchte ich dann nehmen für eigene dll.

Danke.

gruss

Code: Alles auswählen

DECLARE FUNCTION myLibChange LIB "ptr_dll" ALIAS "myLibChange" (ByVal c AS UByte PTR) AS integer

Function myLibChange (ByVal c AS UByte PTR) AS Integer Export
   c[0]=234
   myLibChange=c[0]
END FUNCTION 


DECLARE FUNCTION bitmapzeiger LIB "bitmap_dll" ALIAS "bitmapzeiger" (ByVal c AS Integer PTR) AS integer

Function bitmapzeiger (ByVal c AS Integer PTR) AS Integer Export
	Dim z As Integer
	
	For z=0 To 128*128
   	*c=&h00ff00
    	c=c+1
	Next 
End FUNCTION 

DECLARE FUNCTION myLibAdd LIB "test_asm_dll" ALIAS "myLibAdd" (BYREF a AS INTEGER, _
     ByRef b AS INTEGER) AS INTEGER
DECLARE FUNCTION myLibChange LIB "test_asm_dll" ALIAS "myLibChange" (ByVal c AS INTEGER PTR) AS INTEGER

FUNCTION myLibAdd (BYREF a AS INTEGER, BYREF b AS INTEGER) AS INTEGER EXPORT
   ASM
      mov esi, [a]
      mov eax, [esi]
      
      mov esi, [b]
      mov ebx, [esi]
      
      ADD eax, ebx
      
      mov [FUNCTION], eax
   END ASM
END Function

FUNCTION myLibChange (ByVal c AS INTEGER PTR) AS INTEGER EXPORT
   ASM
      mov esi, [c]
      mov eax, [esi]
      ADD eax, 11
      mov [esi], eax
      
      mov [FUNCTION], eax
   END ASM
END FUNCTION 

Re: Hilfe für dll umsetzen.

Verfasst: 20.06.2010 11:42
von edel
Versuch es mal damit :

Code: Alles auswählen

ProcedureDLL myLibChange(*c.byte)
  *c\b = 234
  ProcedureReturn *c\b
EndProcedure

ProcedureDLL bitmapzeiger (*c.long)
  Protected z.i
  
  For z=0 To 128*128
    *c\l = $00ff00
    *c = *c + 1
  Next 
  
EndProcedure

ProcedureDLL myLibAdd (a, b)  
  ProcedureReturn a + b    
EndProcedure

ProcedureDLL myLibChange(*c)    
  *c\i + $11
  ProcedureReturn *c\i    
EndProcedure

Re: Hilfe für dll umsetzen.

Verfasst: 20.06.2010 18:47
von super_castle
Jup, danke.

Gruss

Re: Hilfe für dll umsetzen.

Verfasst: 20.06.2010 22:37
von Blackskyliner
Nur mal so, als ASM Interessant...

Warum läd der Code oben eigentlich erst die variablen in den "esi" und dann erst ins "eax", bzw. "ebx" und nicht direkt in die entsprechenden Register eax und ebx, sondern erst so umständlich?

Re: Hilfe für dll umsetzen.

Verfasst: 20.06.2010 22:42
von super_castle
Ist eine Test-Dll mit Asm-code.
Das umständliche daran ist für mich erstmal Sekundär.
Wichtig war das sie so mit Rapidq läuft.

Das negative:
Die untere Purebasic-Dll läuft leider nicht so mit Rapidq.

Re: Hilfe für dll umsetzen.

Verfasst: 20.06.2010 22:58
von Thorium
Blackskyliner hat geschrieben:Nur mal so, als ASM Interessant...

Warum läd der Code oben eigentlich erst die variablen in den "esi" und dann erst ins "eax", bzw. "ebx" und nicht direkt in die entsprechenden Register eax und ebx, sondern erst so umständlich?
Er läd sie nicht erst ins esi und dann ins eax. Es handelt sich hier um einen Pointer, es wird erst die adresse des pointers ins esi geladen um dann die Variable, welche sich an der durch esi adressierten adresse befinded in eax laden zu können.
Geht glaub ich aber auch etwas einfacher mit LEA, aber damit hab ich noch nie was gemacht. ^^

Re: Hilfe für dll umsetzen.

Verfasst: 21.06.2010 04:58
von edel
super_castle hat geschrieben:Ist eine Test-Dll mit Asm-code.
Das umständliche daran ist für mich erstmal Sekundär.
Wichtig war das sie so mit Rapidq läuft.

Das negative:
Die untere Purebasic-Dll läuft leider nicht so mit Rapidq.
Es kann natuerlich sein das ich da oben nen Fehler eingebaut habe. Aber um dir zu helfen
muesste man wissen wieso die DLL nicht laeuft (jaja, Beine wird sie nicht haben ;)).
Gibt es eine Fehlermeldung, schmiert das Programm ab, ...?

Was das ASM Zeug betrifft, so bin ich mir fast schon sicher das PB aehnlich "optimiert" :lol:

Re: Hilfe für dll umsetzen.

Verfasst: 21.06.2010 09:40
von Thorium
Also die Addition ist auf jeden Fall falsch, da es wie gesagt Pointer sind. Aber wozu man so ne Addition als funktion braucht ist mir ein Rätsel.

Re: Hilfe für dll umsetzen.

Verfasst: 21.06.2010 16:49
von edel
Stimmt, ich habe das byRef gekonnt ueberlesen.

Code: Alles auswählen

ProcedureDLL myLibAdd (*a.long, *a.long) 
  ProcedureReturn *a\l + *b\l
EndProcedure

Re: Hilfe für dll umsetzen.

Verfasst: 21.06.2010 17:03
von super_castle
Aber wozu man so ne Addition als funktion braucht ist mir ein Rätsel.
Au man,wo bin ich hier.... :D

Kann man nicht erstmal mit einfachen Dingen eine Dll testen..., man diese Sprüche immer....oh.... :bounce:

Das ist der deutsche Arbeiterabgrund....