AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[Delphi] ASM => applicationdata

Ein Thema von o0o · begonnen am 6. Mär 2008 · letzter Beitrag vom 7. Mär 2008
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von o0o
o0o

Registriert seit: 20. Jul 2007
Ort: am...,da wo die sonne nicht scheint!
166 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 17:19
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
(_/marabu-fan inside\_)
[-\_______________/-]
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.479 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:10
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 ..
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:15
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:27
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#17

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 18:41
Keine Ahnung wie du das meinst .. zeig mir das mal bitte anhand des Codes.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: [Delphi] ASM => applicationdata

  Alt 6. Mär 2008, 20:34
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)...
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von o0o
o0o

Registriert seit: 20. Jul 2007
Ort: am...,da wo die sonne nicht scheint!
166 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: [Delphi] ASM => applicationdata

  Alt 7. Mär 2008, 02:39
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
(_/marabu-fan inside\_)
[-\_______________/-]
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#20

Re: [Delphi] ASM => applicationdata

  Alt 7. Mär 2008, 10:32
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
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