Delphi-PRAXiS
Seite 2 von 3     12 3      

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 6. Mär 2008 16:19

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

jbg 6. Mär 2008 17:06

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:
function GetWindowsDirectory: string;
var
  path: array[0..MAX_PATH] of Char;
begin
  SetString(Result, path, GetWindowsDirectory(path, SizeOf(path)));
  Result := Result + '\';
end;
Und nun zur Lösung des Problems:
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;

Zacherl 6. Mär 2008 17:10

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:
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;
Ansonsten funktioniert es ..

sirius 6. Mär 2008 17:15

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.

Zacherl 6. Mär 2008 17:23

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;

sirius 6. Mär 2008 17:27

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.

Zacherl 6. Mär 2008 17:41

Re: [Delphi] ASM => applicationdata
 
Keine Ahnung wie du das meinst .. zeig mir das mal bitte anhand des Codes.

Apollonius 6. Mär 2008 19:34

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)...

o0o 7. Mär 2008 01:39

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

SirThornberry 7. Mär 2008 09:32

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 07:19 Uhr.
Seite 2 von 3     12 3      

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