Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Delphi] ASM => applicationdata (https://www.delphipraxis.net/109723-%5Bdelphi%5D-asm-%3D-applicationdata.html)

o0o 7. Mär 2008 14:19

Re: [Delphi] ASM => applicationdata
 
0_o omg klappt das echt??? xDDD

ich probiers mal scherzeshalber aus...hatte da garnicht dran gedacht^^

da o0o

Zacherl 7. Mär 2008 14:48

Re: [Delphi] ASM => applicationdata
 
Zitat:

Zitat von Apollonius
Wie willst du aus einer Funktion einen PChar zurückgeben, ohne Verwirrung zu stiften? Entweder du kopierst die Zeichenkette in einen vorgegebenen PChar (so machen es die WinAPIs) oder du gibst einen String zurück. Andernfalls muss der Nutzer nämlich raten, ob er HeapFree, LocalFree, GlobalFree oder FreeMem nehmen muss, um aufzuräumen.
Und du kannst eine Menge optimieren, lokale Variablen rausschmeißen, kein cmp eax, 0 verwenden (sonder test eax, eax)...

Würde mich mal interessieren wie man das jetzt optimiert. Codebeispiel erwünscht :P Mache normal nichts mit inline Assembler .. wenn dann richtig MASM32.

Apollonius 7. Mär 2008 15:53

Re: [Delphi] ASM => applicationdata
 
Weil du es bist:
Delphi-Quellcode:
function GetShellFolder(CSIDL: Integer): PChar;
asm
  push eax //das ist die Variable PIDL
  push esp
  push eax
  push 0
  call SHGetSpecialFolderLocation
  test eax, eax
  jnz @@ExitProc
  push MAX_PATH
  push GMEM_FIXED
  call GlobalAlloc
  pop edx
  push eax
  push eax
  push edx
  call SHGetPathFromIDList
  pop eax
  @@ExitProc:
end;
Allgemein ist test Register, Register besser als cmp Register, 0, da es in 2 statt 3 Bytes codiert wird. Außerdem ist bei GMEM_FIXED bzw. GPTR kein GlobalLock notwendig.
Des Weiteren führt der Code (auch meiner) zu einem Speicherleck: PIDL soll man laut MSDN mit dem IMalloc der Shell freigeben.

SirThornberry 7. Mär 2008 16:03

Re: [Delphi] ASM => applicationdata
 
um sich die Arbeit zu ersparen kann man anstelle von SHGetSpecialFolderLocation auch SHGetSpecialFolderPath verwenden.

Zacherl 7. Mär 2008 16:26

Re: [Delphi] ASM => applicationdata
 
Oki Danke dir Apollonius :thumb: Was ich noch nicht verstehe ist wo du Result setzt und wo du CLSID ausließt. Werden die Werte automatisch in die von dir verwendeten Register geschrieben?

Apollonius 7. Mär 2008 16:28

Re: [Delphi] ASM => applicationdata
 
Aufrufkonvention Register -> erster Parameter in EAX, zweiter in EDX, dritter in ECX, weitere auf dem Stack, außerdem wird bei allen Aufrufkonventionen außer Safecall der Rückgabewert in EAX gespeichert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz