![]() |
Re: [Delphi] ASM => applicationdata
hmm ok...das ist ein schnipsel den ich im inet fand^^
von daher bitte nicht boese sein ich hab von asm echt kein plan...ist nur fuer die schule^^ wuesstest du jetzt eig wie ich das fuer den ordner anwendungsdaten umbaue? ich kann mit deinem link jetzt nicht viel anfangen^^ da o0o |
Re: [Delphi] ASM => applicationdata
Ich hoffe kein anderer versucht mit Hilfe der bisher geposteten Codes (Zacherl mal ausgenommen) was zu lernen.
@1234588: Wen denkst du wieviele Bytes du mit New(P) [P: PChar] reservierst? Genau ein einziges. Die Kompressionsalgorithmen sind zwar mittlerweile recht gut, aber so gut auch wieder nicht als dass sie einen mehrere Zeichen umfassenden Pfad in ein Byte quetschen könnten. Nun zu dem Pascal-Assembler Gemisch. Assembler ist gar nicht notwendig und macht das ganze nur kompliziert.
Delphi-Quellcode:
Und nun zur Lösung des Problems:
function GetWindowsDirectory: string;
var path: array[0..MAX_PATH] of Char; begin SetString(Result, path, GetWindowsDirectory(path, SizeOf(path))); Result := Result + '\'; end;
Delphi-Quellcode:
function GetSpecialPath(nFolder: Integer): string;
var Buffer: array[0..MAX_PATH] of Char; begin if SHGetSpecialFolderPath(Application.Handle, Buffer, nFolder, False) then Result := Buffer else RaiseLastOSError; end; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage( GetSpecialPath(CSIDL_APPDATA) ); end; |
Re: [Delphi] ASM => applicationdata
Ich glaube er will in allen möglichen Sprachen den Windows Pfad und den AppData Pfad ermitteln .. daher möchte er auch Assembler verwenden. Warum inline Assembler und nicht direkt MASM32 weiß ich auch nicht .. hab mal bisschen rumgewerkelt, aber die auskommentierten Zeilen bekomme ich in inline Assembler nicht hin:
Delphi-Quellcode:
Ansonsten funktioniert es ..
function GetShellFolder(CSIDL: Integer): string;
var pidl: PItemIdList; FolderPath: String; SystemFolder: Integer; begin asm mov eax, CSIDL mov SystemFolder, eax lea eax, pidl push eax push SystemFolder push 0 call SHGetSpecialFolderLocation push eax call SUCCEEDED cmp eax, 0 je @@ExitProc // SetLength(FolderPath, MAX_PATH) push FolderPath push pidl call SHGetPathFromIDList cmp eax, 0 je @@ExitProc // SetLength(FolderPath, Length(PChar(FolderPath)) // Result := FolderPath @@ExitProc: end; end; |
Re: [Delphi] ASM => applicationdata
Bei den Auskommentierten Zeilen musst du direkt die Funktionen aus der Unit System aufrufen. Andernfalls geht es nicht innerhalb von Delphi. Denn ein bisschen muss man schon mit dem Speichermanager zusammenarbeiten.
Ein bisschen rauskürzen geht noch, wenn du FolderPath selber verwaltest. Und besser sieht es noch aus, wenn du die lokalen Variablen komplett selber übernimmst. Dann musst du nur noch beim result auf Delphi-gombadibilideed achten. |
Re: [Delphi] ASM => applicationdata
So hier .. die dummen Strings mit PChar ersetzt und bisschen optimiert. Ohne Strings ist es sehr einfach:
Delphi-Quellcode:
function GetShellFolder(CSIDL: Integer): PChar;
var PIDL: PItemIdList; SystemFolder: Integer; asm mov eax, CSIDL mov SystemFolder, eax lea eax, PIDL push eax push SystemFolder push 0 call SHGetSpecialFolderLocation push eax call SUCCEEDED cmp eax, 0 je @@ExitProc push MAX_PATH push GPTR call GlobalAlloc push eax call GlobalLock mov Result, eax push Result push PIDL call SHGetPathFromIDList @@ExitProc: end; |
Re: [Delphi] ASM => applicationdata
Und wer gibt den Speicher wieder frei?
Setze doch einfach den StackPointer um MaxPath nach unten und kopiere den Inhalt dann in den String und schiebe den Stackpointer zurück. |
Re: [Delphi] ASM => applicationdata
Keine Ahnung wie du das meinst .. zeig mir das mal bitte anhand des Codes.
|
Re: [Delphi] ASM => applicationdata
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)... |
Re: [Delphi] ASM => applicationdata
leutz ich danke euch:)
es klappt...^^ wenn der source auch nicht ganz fehlerfrei ist macht nix es muss nur asm sein,...mein lehrer kann kein asm von daher egal, er will nur sehen dass asm dabei ist;) mfg o0o |
Re: [Delphi] ASM => applicationdata
das einfachste ist es einfach in Delphi zu schreiben und dann beim debuggen mal die CPUAnsicht zu öffnen. Da hast du das ganze in asm stehen. Aber warum einfach wenns auch schwer geht ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz