Seite 1 von 1

64bit OS() mit 32bit Xbase++

Verfasst: Mo, 07. Aug 2017 22:12
von AUGE_OHR
hi,

ich wollte an die Desktop Icons und mein Code funktionierte unter 32bit.
der Code funktionierte aber leider nicht auf einem 64bit OS() und ich fragte mich warum :(

beim suchen kam ich auf die Antwort : Der Explorer / Listview sind 64bit :idea:
es gab nun ein Workaround der bei mir funktioniert :blob8: ... aber diskussionsfähig ist ob man das machen "darf" :?:

beim debuggen viel mir auf das der Pointer auf die LVITEM Structure nicht völlig verkehrt war ... die ersten 5 Member stimmten.

Code: Alles auswählen

BEGIN STRUCTURE LVITEM64
   MEMBER UINT       mask
   MEMBER int        iItem
   MEMBER int        iSubItem
   MEMBER UINT       state
   MEMBER UINT       stateMask
erst beim Label bekam ich keinen Text den ich benötige zum identifizieren des Icons.
der Workaround besteht nun darin in die Structure einen Member "dazwischen" einzubauen

Code: Alles auswählen

   MEMBER int        placeholder1                // NEED for 64bit
   MEMBER LPSTR      pszText
   MEMBER int        placeholder2                // NEED for 64bit
   MEMBER int        cchTextMax
und so komme ich nun an den Text des Icons ran.
auch beim Rest benötigt man noch Anpassungen bis alles "passt"

Code: Alles auswählen

   MEMBER int        iImage
   MEMBER LPARAM     lParam
   MEMBER int        placeholder3
   MEMBER int        iIndent
   MEMBER int        iGroupId
   MEMBER UINT       cColumns
   MEMBER int        placeholder4
   MEMBER POINTER32  puColumns
   MEMBER int        placeholder5
   MEMBER POINTER32  piColFmt
   MEMBER int        placeholder6
   MEMBER int        iGroup
   MEMBER int        placeholder7
END STRUCTURE
ich habe da nun eine Structure gebaut die es "so" nicht in der Windows API gibt :-"

leider verstehe ich bislang noch nicht "wieso" es mit der geänderten Structure unter 64bit funktioniert :?:
deshalb bin ich mir auch nicht bewusst ob es da knallen könnte ... ich "lese" nur.

anbei Demo welches die Desktop Icon Positionen speichert / wiederherstellt.
SaveDisk.jpg
SaveDisk.jpg (10.77 KiB) 10070 mal betrachtet
SAVEDESK.ZIP
need ot4xb
(35.76 KiB) 293-mal heruntergeladen

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Mo, 21. Aug 2017 23:13
von AUGE_OHR
update :
wenn jemand die Msgbox() bekam mit
"can not finde SHELLDLL_DefView"
z.b. in der VM, dann ist dieses update notwendig damit er den "Desktop" findet
SAVEDESK_2.ZIP
need ot4xb
(36.35 KiB) 283-mal heruntergeladen

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 10:07
von Hans Zethofer
Hallo!

Save Icons.
beim Restore werden die Icons anders angeordnet, von Links oben nach Unten bleibt der Platz leer wo vorher Icons waren.
dafür werden alle bis zum rechten unteren Ende aneinandergereiht.


Ist das so gewünscht?

32Bit Win10 1703, Xbase++ 1.9.355

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 14:41
von AUGE_OHR
Hans Zethofer hat geschrieben: Di, 22. Aug 2017 10:07beim Restore werden die Icons anders angeordnet, von Links oben nach Unten bleibt der Platz leer wo vorher Icons waren.
dafür werden alle bis zum rechten unteren Ende aneinandergereiht.
hm ... so ist das nicht gedacht.
lösche doch mal die SaveDesk.DBF und starte es neu, dann ein paar Icon verschieben und "Restore"

p.s. "single" Bildschirm oder "multi" (ungetestet) ?

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 19:15
von Hans Zethofer
ist komplett egal od die Datei gelöscht wurde oder nicht - das Ergebnis ist immer das selbe

Single Screen (Notebook)

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 19:18
von AUGE_OHR
Hans Zethofer hat geschrieben: Di, 22. Aug 2017 19:15ist komplett egal od die Datei gelöscht wurde oder nicht - das Ergebnis ist immer das selbe
hm ... siehe doch bitte mal in die DeskSave.DBF was für Koordinaten er hat.

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 19:53
von Hans Zethofer
im savedesk.dbf meinst du
1280 x 800
im DeskIcon.txt stehen die selben Werte drinnen

was noch auffällt - es gibt in der Spalte NAME immer nur ein "lachendes Gesicht"
beim Restore geht er offensichtlich alle Icons durch und das mehrmals und ordnet Sie neu an

Symbole am Raster ausrichten - aktiviert
Symbole automatisch anordnen - deaktiviert

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Di, 22. Aug 2017 21:03
von AUGE_OHR
Hans Zethofer hat geschrieben: Di, 22. Aug 2017 19:53 im savedesk.dbf meinst du
1280 x 800
im DeskIcon.txt stehen die selben Werte drinnen
und was steht in den Feldern PosX und PosY ?
Hans Zethofer hat geschrieben:was noch auffällt - es gibt in der Spalte NAME immer nur ein "lachendes Gesicht"
:?:
in der Spalte sollten die Namen der Icons stehen ... wie sonst soll man die Identifizieren ?
p.s. wie viele Datensätze ?
Hans Zethofer hat geschrieben:beim Restore geht er offensichtlich alle Icons durch und das mehrmals und ordnet Sie neu an
Ja. ich weiss ja nicht welche Icons verschoben sind.
Hans Zethofer hat geschrieben:Symbole am Raster ausrichten - aktiviert
Symbole automatisch anordnen - deaktiviert
sollte nichts ausmachen solange man kein Icon anfasst denn erst dann erfolgen weiter Aktionen wie das automatische ausrichten.

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Mi, 23. Aug 2017 9:56
von Hans Zethofer
vielleicht ist der fehlende "Name" der Schlüssel das es nicht richtig geht.

wie ermittelst du diesen?

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Mi, 23. Aug 2017 23:02
von AUGE_OHR
hi,

mit erstaunen habe ich deine Desktop.TXT gesehen.
es sind die Daten für Position und das Rechteck für die Grösse vorhanden aber keine "Namen" :shock:

das wundert mich denn alle 3 Aufrufe sind (fast) gleich

Code: Alles auswählen

      // Icon Rectangle
      @User32:SendMessageA(hListView, LVM_GETITEMRECT,i-1, GlobalRect)
      @Kernel32:ReadProcessMemory(process, GlobalRect, @oRect, pSizeRect, NULL)

      // Icon Position
      @User32:SendMessageA(hListView, LVM_GETITEMPOSITION, i-1, GlobalIcoPos)
      @Kernel32:ReadProcessMemory(process, GlobalIcoPos, @oPoint, pSizePoint, NULL)

      // Icon Name
      @User32:SendMessageA(hListView, LVM_GETITEMTEXT, i-1, GlobalLVItem)
      @Kernel32:ReadProcessMemory(process, GlobalBuffer, @cBuffer, pSizeString, NULL)
nun ist cBuffer "nur" ein String ... was normalerweise ausreicht. (oRect / oPoint sind Structure)

da es bislang auf allen PCs funktionierte hatte ich es noch nicht "optimiert" und prompt funktioniert es nicht bei dir ... warum ... :^o

egal nun habe ich es "richtig" umgebaut und eine extra Structure angelegt.

Code: Alles auswählen

   BEGIN STRUCTURE MYBUFFER
      MEMBER SZSTR cText SIZE MAX_PATH
   END STRUCTURE

      oBuffer   := MYBUFFER():New()
      pSizeText := oBuffer:_sizeof_()
      GlobalBuffer  := @Kernel32:VirtualAllocEx(process, NULL, pSizeText  , MemFlags, PAGE_READWRITE)
      @Kernel32:WriteProcessMemory(process, GlobalBuffer, @oBuffer , pSizeText  , NULL)
...
      oLVItem:pszText    := GlobalBuffer
      oLVItem:cchTextMax := MAX_PATH
...

      // Icon Name
      oBuffer:cText := ChrR( 0, MAX_PATH )
      @User32:SendMessageA(hListView, LVM_GETITEMTEXT, i-1, GlobalLVItem)
      @Kernel32:ReadProcessMemory(process, GlobalBuffer, @oBuffer, pSizeString, NULL)
damit sollte das nun wirklich "sauber" sein und auch bei dir die Namen für die Icons zurückgeben

Danke für die Rückmeldung
anbei Beta 3
SAVEDESK_3.ZIP
need ot4xb
(37.07 KiB) 261-mal heruntergeladen

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Do, 24. Aug 2017 0:20
von Hans Zethofer
Sicher ?

Sie dir die .TXT an - alle Namen sind gleich

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Do, 24. Aug 2017 0:46
von AUGE_OHR
Hans Zethofer hat geschrieben: Do, 24. Aug 2017 0:20 Sicher ?
Sie dir die .TXT an - alle Namen sind gleich
:shock:

die Zeichenfolge {ED7BA470-8E54-465E-825C-99712043E01C} steht für den "God-Modus" und sollte bei "leeren Namen" im "Spezial-Fall" wirken ...
mir geht aber langsam die Ideen aus woran es "bei dir" liegen könnte das du keine Desktop Icon Namen bekommst :-k

wir hatte doch schon mal ein "spezielles" Problem ...
welche Windows Theme verwendest du ? oder etwa "Classic Mode" ?

p.s. die Desksave.DBF im Zweifel vorher löschen.

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Do, 24. Aug 2017 10:18
von Hans Zethofer
Das Problem seinerzeit (aber auch eine andere Maschine) war der Antivirus!

ich verwende das normale Win10 Design mit dem blauen Hintergrund und dem Fenster rechts

ich würde dir ja gerne etwas zuschicken wie sich der Aufbau abspielt, vielleicht erkennst du da etwas mehr

irgendeine Idee was dir helfen könnte, ansonsten lege ich das zu den Akten!

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Do, 24. Aug 2017 23:24
von AUGE_OHR
Hans Zethofer hat geschrieben: Do, 24. Aug 2017 10:18ich würde dir ja gerne etwas zuschicken wie sich der Aufbau abspielt, vielleicht erkennst du da etwas mehr
wenn er keinen Namen zuordnen kann fängt er bei 0,0 Windows oben/links) an. das nächste Icon wird darunter angeordnet bis Bottom erreicht ist und er die nächste Spalte anfängt.

nun ist es mir nun schleierhaft warum die ersten beiden API Function funktionieren aber bei dir der 3th versagt :angry4:
ich kann es leider auf keiner meiner Hardware simulieren ... auch nicht (mehr) in der VM (wo er den Desktop nicht fand)

Frage : kannst du es auf einem 64bit Windows 10 1703 testen ?

ich komme nur auf die Idee weil es bei Pablo in der LvItem() Structure das hat

Code: Alles auswählen

   _XBST_LPSTR_DYNSZ( pszText , cText) 
ich habe also nun vorsichtshalber cText nach ccText umbenannt um Problem mit DYNSZ cText zu vermeiden.

Code: Alles auswählen

   BEGIN STRUCTURE MYBUFFER
      MEMBER SZSTR ccText SIZE MAX_PATH
   END STRUCTURE
unter 64bit musste ich ja mit einer eigenen Structure tricksen was ja auch das Thema des Thread ist.

so hier nun mein letzter Versuch auf diese Weise die Desktop Icon zu restaurieren
... möglicherweise gib es was viel einfacheres :-"

Re: 64bit OS() mit 32bit Xbase++

Verfasst: Fr, 25. Aug 2017 9:18
von Hans Zethofer
diese Version geht auch nicht!
da bleibt die .txt komplett leer und die .dbf auch

werde es auf einer 64Bit Maschine testen - berichte dann