|  |  | 
|  | 
|  | 
|  | | Welche Register müssen hier gesichert werden. Oder wird das von Xpia4 bzw XProfan übernommen das richtige Sichern von Registern?
 
 mfg
 KompilierenMarkierenSeparieren
  $MAKE CLE
 $H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
If 0
    AsmStart pset
        Parameters hdcwin&,x&,y&,f&
        mov ecx,para1
        mov eax,para2
        mov ebx,para3
        mov edi,para4
        invoke SetPixel,ecx,eax,ebx,edi
    AsmEnd
EndIf
whileloop 0,100,1
    x&=&loop
    y&=&loop
    f&=$ff0000
    Call(GetXpiaProcAddress(XpiaModule&,pset),hdcwin&,x&,y&,f&)
endwhile
WaitInput
End
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Frank
 Abbing
 | | Quasi jede API verändert die Register. Wenn du die Daten nach der API wieder benutzen willst, musst du sie vorher auf den Stack pushen und später wieder runternehmen. Oder Variablen verwenden. Welche Register eine API benutzt, ist immer verschieden. Du kannst auch nie ganz sicher sein, dass ein Register nicht verändert wird. Das kann sich bei nächsten Betriebssystem schon geändert haben.
 Das hier geht übrigens auch:
 KompilierenMarkierenSeparieren
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Jup,danke. 
 Was macht die Profan2Cpp-Lösung?
 
 mfg
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Sebastian
 König
 | | 2peter Bierbach, Beitrag=52367, Zeitpunkt=15.05.2009 
 Was macht die Profan2Cpp-Lösung?
 
 Frank hat mir vorhin erklärt, was sich bei XPIA geändert hat. Ich werde dann demnächst mein Plug-In daran anpassen. Kann aber etwas dauern, da ich zur Zeit sehr mit anderen Dingen beschäftigt bin...
 
 MfG
 
 Sebastian
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Jup, alles klar. 
 Die erstellten Dll von Xpia4 laufen mit dem Profan2Cpp wunderbar.
 
 Habe jetzt mal 2 Exe erstellt mit XProfan.
 Einmal mit Asmstart/Asmend und einmal mit der oben erstellten Dll.
 
 Mit Asmstart/Asmend 10200 Zeiteinheiten und das gleiche mit der Dll 4550 Zeiteinheiten.
 Die Profan2Cpp läuft zur Zeit nur mit der Xpia4-Dll und braucht 4100 Zeiteinheiten.
 
 Mit Dll :
 KompilierenMarkierenSeparieren
  $H Windows.ph
DEF createpen(3) ! asm_grafik1.dll,createpen
DEF lineto(3) ! asm_grafik1.dll,lineto
DEF movetoex(3) ! asm_grafik1.dll,movetoex
DEF pset(4) ! asm_grafik1.dll,pset
Declare hwin&,x&,y&,f&,hdcwin&,pstyle&,pwidth&,pcolor&,mypen&,test%
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
pstyle&=3
pwidth&=0
pcolor&=$ff0000
mypen&=createpen(pstyle&,pwidth&,pcolor&)
~SelectObject( hdcwin&, mypen& )
test%=&GetTickCount
whileloop 1,10000,1
    x&=200
    y&=200
    movetoex(hdcwin&,x&,y&)
    x&=400
    y&=40
    lineto(hdcwin&,x&,y&)
endwhile
Print Str$(Int(&GetTickCount-test%))
WaitInput
End
Ohne Dll:
 KompilierenMarkierenSeparieren
  $MAKE CLEI
 $H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&,pstyle&,pwidth&,pcolor&,mypen&,test%
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
If 0
    AsmStart createpen
        Parameters pstyle&,pwidth&,pcolor&
        invoke CreatePen,para1,para2,para3
    AsmEnd(mypen&)
    AsmStart movetoex
        Parameters hdcwin&,x&,y&
        invoke MoveToEx,para1,para2,para3,0
    AsmEnd
    AsmStart pset
        Parameters hdcwin&,x&,y&,f&
        invoke SetPixel,para1,para2,para3,para4
    AsmEnd
    AsmStart lineto
        Parameters hdcwin&,x&,y&
        invoke LineTo,para1,para2,para3
    AsmEnd
EndIf
pstyle&=3
pwidth&=0
pcolor&=$ff0000
mypen&=Call(GetXpiaProcAddress(XpiaModule&,createpen),pstyle&,pwidth&,pcolor&)
~SelectObject( hdcwin&, mypen& )
test%=&GetTickCount
whileloop 1,10000,1
    x&=200
    y&=200
    Call(GetXpiaProcAddress(XpiaModule&,movetoex),hdcwin&,x&,y&)
    x&=400
    y&=40
    Call(GetXpiaProcAddress(XpiaModule&,lineto),hdcwin&,x&,y&)
endwhile
Print Str$(Int(&GetTickCount-test%))
WaitInput
End
mfg
 | 
 
  | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Sebastian
 König
 | | Ist das jetzt nur ein Beispiel oder warum kapselt du diese einfachen API-Aufrufe in DLL-Funktionen? Ich meine, ein einfaches 
 DEF SetPixel(3) !GDI32,SetPixel
 usw.
 
 ist doch sicher die effizienteste Lösung...
 
 MfG
 
 Sebastian
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | ist doch sicher die effizienteste Lösung... 
 Wird vom Tool, welches bei Xpia4 mit dabei ist, so angefertigt für den Aufruf.
 
 Ist das jetzt nur ein Beispiel oder warum kapselt du diese einfachen API-Aufrufe in DLL-Funktionen?
 
 Die Routinen wurden mal mit invoke über Xpia4 aufgerufen. Ist ein Funktionstest.
 
 mfg
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Frank
 Abbing
 | | 
 ist doch sicher die effizienteste Lösung... 
 Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren.
  | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren. 
 Die Scheife selber ist mit Profan2Cpp schon ein Blitz, wo es ja jetzt wunderbar über dem Aufruf von Xpia4 läuft.
 
 Ich wollte nur mal das wesentliche Testen.
 
 mfg
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Sebastian
 König
 | | 2peter Bierbach, Beitrag=52377, Zeitpunkt=16.05.2009 
 Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren.
 Die Scheife selber ist mit Profan2Cpp schon ein Blitz, wo es ja jetzt wunderbar über dem Aufruf von Xpia4 läuft.
 
 Ich wollte nur mal das wesentliche Testen.
 
 Mir ging es jetzt nur darum, dass man einfache API-Funktionen auch direkt mit DEF bzw. External() verwenden kann - eine Kapselung in einen ASM-Block bringt nur zusätzlichen Overhead mit sich...
 
 MfG
 
 Sebastian
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 |