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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

64bit OS() mit 32bit Xbase++

Beitrag 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) 9883 mal betrachtet
SAVEDESK.ZIP
need ot4xb
(35.76 KiB) 289-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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) 280-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag 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
_____________
lg
Hans
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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) ?
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag von Hans Zethofer »

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag 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
_____________
lg
Hans
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag von Hans Zethofer »

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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) 259-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag von Hans Zethofer »

Sicher ?

Sie dir die .TXT an - alle Namen sind gleich
Dateianhänge
DeskIcon.TXT
(3.67 KiB) 263-mal heruntergeladen
_____________
lg
Hans
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

Beitrag 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!
_____________
lg
Hans
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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 :-"
Dateianhänge
SAVEDESK_4.ZIP
need ot4xb
(37.8 KiB) 276-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

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

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