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
es gab nun ein Workaround der bei mir funktioniert
... 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 (10.77 KiB) 10070 mal betrachtet
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
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"
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 ...
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
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
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
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
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
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