Makro von 32bit auf 64bit umschreiben

Moderator: ModerationP

Re: Makro von 32bit auf 64bit umschreiben

Beitragvon Gast » 04. Sep 2019, 15:07

Hallo Ulrich

ich kann das Makro komplett im Einzelschritt durchlaufen. Es öffnet sich kein Dialogfeld. Im Wert der Variablen getfildir und strbackuppath wird "" angezeigt. Ich habe keine Ahnung und komme leider per direkter Anleitung nicht weiter.

Danke und Gruss Jens
Gast
 

Re: Makro von 32bit auf 64bit umschreiben

Beitragvon knobbi38 » 05. Sep 2019, 00:05

Hallo Jens,

wenn ich mir das genau betrachte, sind da mehrere Fehler in GetFileDir() enthalten, die sich auch noch gegenseitig beeinflussen.

1) Der ReturnCode von GetSaveFileName() wird nicht richtig ausgewertet sondern das Ergebnis wird auf 0 geprüft und mit 'Cancel' gleichgesetzt. Das führt dazu, daß nicht mehr zwischen einem Fehler bei der Ausführung und einem Abbruch durch den Benutzer unterschieden werden kann. Genau das aber ist hier der Fall. Der API Aufruf ist fehlerhaft und wird hierduch nicht erkannt. Das ist ein klassisches Beispiel aus dem Lehrbuch, wie man es nicht machen sollte!
2) Die Typdeklaration für die Struktur 'OPENFILENAME' ist fehlerhaft und verursacht in der 64Bit-Version einen Fehler.
3) Die API-Deklaration für GetSaveFileNameA ist fehlerhaft.
4) Die Größe von OPENFILENAME wird an .lStructSize für 64Bit falsch berechnet und zugewiesen.[/list]

Jens, mindestens 2. und 3. hätten nicht sein müssen, hättest du dir die Hinweise genauer angeschaut, 1. und 4. fallen hingegen kaum auf und ich bin auch erst durch deine Beschreibung vom Debuggen darauf gekommen.

zu 2 u. 3:
die richtige Deklaration, auch für 64Bit, stehen in der Datei "Win32API_PtrSafe.TXT", die du hier herunterladen kannst:
https://www.microsoft.com/en-us/download/details.aspx?id=9970

zu 4:
die richtige Größe des Typs OPENFILENAME wird mit der Funktion lenB() ermittelt! Also muß
.lStructSize = Len(SpeichernAls)
durch
.lStructSize = LenB(SpeichernAls)
ersetzt werden.
Hier nochmal erklärt (leider nur auf englisch): A common pitfall - The size of user-defined types

zu 1:
ein Beispiel, wie der Rückgabewert ausgewertet werden könnte:
Code: Alles auswählen
' air code:
dim lngDlgErrorCode as Long
...
if GetSaveFilename(SpeichernAls) = 0 then
  ' Error or canceled - get the error code
  lngDlgErrorCode = CommDlgExtendedError()

  if lngDlgErrorCode= 0 then
    ' Canceled
    getfiledir = ""
  else
    ' Error
    getfiledir = "ERROR_OCCURRED:" _
               & "Error #" & lngDlgErrorCode _
               & "(Procedure: " & PROCNAME & ")"
  end if
 
  goto ExitScript
end if
...
Die Definitionen und Deklarationen stammen aus "Win32API_PtrSafe.TXT".

GetFileDir() sollte damit erstmal laufen, wenn ich nicht noch etwas übersehen habe.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1199
Registriert: 02. Jul 2015, 14:23

Re: Makro von 32bit auf 64bit umschreiben

Beitragvon katutcho » 05. Sep 2019, 08:18

Guten Morgen Ulrich

Besten Dank, es hat geklappt und das Makro funktioniert jetzt auch unter Office 64bit.

Punkt 1: Habe ich versucht einzupflegen, es kommt folgt dann Fehler beim Kompilieren. Ich habe es dann in der Ursprungsversion gelassen und probiert und es scheint zu funktioniern.
Punkt 2 habe ich angepasst
3. Habe ich das API nach Vorlage aus dem Netz korrigiert
4. Angepasst

Besten Dank und Grüsse
Jens
katutcho
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 13
Registriert: 07. Mär 2016, 10:24

Vorherige

Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste