Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

64bit OS() mit 32bit Xbase++

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

64bit OS() mit 32bit Xbase++

Beitrag von AUGE_OHR » Mo, 07. Aug 2017 22:12

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) 235 mal betrachtet
SAVEDESK.ZIP
need ot4xb
(35.76 KiB) 4-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Mo, 21. Aug 2017 23:13

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) 1-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 248
Registriert: Fr, 27. Jan 2006 9:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

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

Beitrag von Hans Zethofer » Di, 22. Aug 2017 10:07

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
_____________
lg
Hans

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Di, 22. Aug 2017 14:41

Hans Zethofer hat geschrieben:
Di, 22. Aug 2017 10:07
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.
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) ?
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 248
Registriert: Fr, 27. Jan 2006 9:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

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

Beitrag von Hans Zethofer » Di, 22. Aug 2017 19:15

ist komplett egal od die Datei gelöscht wurde oder nicht - das Ergebnis ist immer das selbe

Single Screen (Notebook)
_____________
lg
Hans

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Di, 22. Aug 2017 19:18

Hans Zethofer hat geschrieben:
Di, 22. Aug 2017 19:15
ist 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.
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 248
Registriert: Fr, 27. Jan 2006 9:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

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

Beitrag von Hans Zethofer » Di, 22. Aug 2017 19:53

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
_____________
lg
Hans

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Di, 22. Aug 2017 21:03

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.
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 248
Registriert: Fr, 27. Jan 2006 9:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

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

Beitrag von Hans Zethofer » Mi, 23. Aug 2017 9:56

vielleicht ist der fehlende "Name" der Schlüssel das es nicht richtig geht.

wie ermittelst du diesen?
_____________
lg
Hans

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Mi, 23. Aug 2017 23:02

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) 1-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 248
Registriert: Fr, 27. Jan 2006 9:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

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

Beitrag von Hans Zethofer » Do, 24. Aug 2017 0:20

Sicher ?

Sie dir die .TXT an - alle Namen sind gleich
Dateianhänge
DeskIcon.TXT
(3.67 KiB) 1-mal heruntergeladen
_____________
lg
Hans

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10499
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Do, 24. Aug 2017 0:46

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.
gruss by OHR
Jimmy

Antworten