Fehler beim Anlegen ...
Moderator: Moderatoren
Fehler beim Anlegen ...
Hallo,
ich habe den Makrocode in der Bibliothek per Passwort geschützt.
Wenn ich jetzt im Calc_Dokument per Makro auf den passwortegeschützten
Code zugreife, erscheint folgende Fehlermeldung:
Fehler beim Anlegen.
Das Modul konnte nicht geladen werden; ungültiges Format.
Wo liegt der Fehler?
mfg
mike
ich habe den Makrocode in der Bibliothek per Passwort geschützt.
Wenn ich jetzt im Calc_Dokument per Makro auf den passwortegeschützten
Code zugreife, erscheint folgende Fehlermeldung:
Fehler beim Anlegen.
Das Modul konnte nicht geladen werden; ungültiges Format.
Wo liegt der Fehler?
mfg
mike
Re: Fehler beim Anlegen ...
Hey Mike,
eine passwortgeschützte Bibliothek wird verschlüsselt. Greifst du nun per Code darauf zu, ist sie nicht zu lesen - das ist normal. Sie muss vorher "entschlüsselt" werden!
Ob es dafür auch eine entsprechende Methode gibt, weiss ich nicht direkt. Wird es aber wohl - aber da mussst du mal selber suchen.
Gruss
Thomas
eine passwortgeschützte Bibliothek wird verschlüsselt. Greifst du nun per Code darauf zu, ist sie nicht zu lesen - das ist normal. Sie muss vorher "entschlüsselt" werden!
Ob es dafür auch eine entsprechende Methode gibt, weiss ich nicht direkt. Wird es aber wohl - aber da mussst du mal selber suchen.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Re: Fehler beim Anlegen ...
Hallo Thomas,
was macht es für einen Sinn, dass ich auf geschützten Makrocode nicht
mehr zugreifen kann?????
Das komische ist ja, dass 3 Makros in einer geschützen Bibliothek laufen, eins nicht.
Nehme ich das Kennwort weg, funktionieren alle 4 Makros.
mfg
mike
was macht es für einen Sinn, dass ich auf geschützten Makrocode nicht
mehr zugreifen kann?????
Das komische ist ja, dass 3 Makros in einer geschützen Bibliothek laufen, eins nicht.
Nehme ich das Kennwort weg, funktionieren alle 4 Makros.
mfg
mike
Re: Fehler beim Anlegen ...
Du kannst (ggf.: 'Du kannst üblicherweise') Code aus verschlüsselten Bibliotheken nicht direkt aufrufen sondern nur mittels eines Makro (evt. einer Funktion) aus einer unverschlüsselten Bibliothek heraus. Üblicherweise ist das die Bibliothek "Standard", ich nehme aber an es wird mit beliebigen anderen Bibliotheken auch funktionieren.
Wenn sich Code aus verschlüsselten Bibliotheken dann trotzdem nicht ausführen lässt, dann deshalb weil diese nicht geladen waren, Du solltest im Falle verschlüsselter Bibliotheken diese also immer laden bevor Du versuchst Code daraus auszuführen (mittels .LoadLibrary, siehe OOo-Hilfe).
Da ich das routinemäßig immer tue (und ggf. auch weil ich Deinen Code nicht kenne), kann ich Dir nicht sagen ob das hier:
Das komische ist ja, dass 3 Makros in einer geschützen Bibliothek laufen, eins nicht.
im Speziellen besondere Ursachen hat, das Übliche wäre das Verhalten das notwendigerweise zu ladende Bibliotheken, wenn sie nicht geladen sind, beim ersten Aufruf einen Fehler erzeugen, gleichzeitig im Hintergrund geladen werden und bei weiteren Zugriffen nun keinen Fehler mehr erzeugen weil sie ja inzwischen geladen sind.
Vielleicht liegt das Mißverständnis auch in der Ungenauigkeit des Begriffes "Zugriff", dann übersetze den mit "Einblicknahme in den Quellcode erlangen", denn das ist es worum es im Kern geht.(*) OOo hingegen braucht den Quellcode nur um ihn in Maschinencode zu übersetzen, denn nur der (und nicht der Quellcode) wird ausgeführt.
Ob beim Verschlüsseln der Bibliotheken nun intern der Quellcode verschlüsselt wird oder bereits Maschinencode verschlüsselt wird, kann ich Dir nicht sagen (vermuten würde ich, wegen der Multiplattformfähigkeit, das tatsächlich der Quellcode verschlüsselt wird).
(*)
Du kannst das gerne selbst ausprobieren, beispielsweise ausgehend von einem Dokument welches die ungeschütze Bibliothek namens Standard enthält, welche in Module1 folgenden Code beinhaltet:
und eine geschützte Bibliothek namens "Lbrary1" mit Module1:
achte darauf das Library1 mit Passwort geschützt ist, speichere das Dokument und lade das Dokument neu.
*Überzeuge Dich das Du Library1 nicht einsehen kannst (verzichte jedoch zunächst auf die Passworteingabe)
*starte Makro Test() und Du siehst den Code der ungeschützten Bibliothek, jedoch nicht den der geschützten
*starte Makro geschuetztes_makro_ausfuehren() um Dich zu überzeugen das das geschützte Makro trotzdem ausgeführt werden kann
*gib das Passwort für Library1 ein um den Code einsehen zu können
*starte nochmals Test() um jetzt zu sehen das auch der Code der zweiten Bibliothek sichtbar ist
Was Du nun mittels Passworteingabe manuell gemacht hast wäre genausogut im Makro Test() möglich mittels .verifyLibraryPassword(Name, Pass), wobei:
Name = Name der Bibliothek
Pass = Passwort
im Konkreten stellt sich die Frage nach dem Sinn, denn da das Passwort nun im ungeschützten Code steht, ist es einsehbar, allerdings wäre ja das Makro Test() auch in die geschütze Bibliothek zu verlagern und dann aus der ungeschützten nur aufzurufen.
Gruß
Stephan
Wenn sich Code aus verschlüsselten Bibliotheken dann trotzdem nicht ausführen lässt, dann deshalb weil diese nicht geladen waren, Du solltest im Falle verschlüsselter Bibliotheken diese also immer laden bevor Du versuchst Code daraus auszuführen (mittels .LoadLibrary, siehe OOo-Hilfe).
Da ich das routinemäßig immer tue (und ggf. auch weil ich Deinen Code nicht kenne), kann ich Dir nicht sagen ob das hier:
Das komische ist ja, dass 3 Makros in einer geschützen Bibliothek laufen, eins nicht.
im Speziellen besondere Ursachen hat, das Übliche wäre das Verhalten das notwendigerweise zu ladende Bibliotheken, wenn sie nicht geladen sind, beim ersten Aufruf einen Fehler erzeugen, gleichzeitig im Hintergrund geladen werden und bei weiteren Zugriffen nun keinen Fehler mehr erzeugen weil sie ja inzwischen geladen sind.
Na den den Code gerade davor (Zugriff) schützen zu wollen, warum sollte man ihn sonst verschlüsseln.was macht es für einen Sinn, dass ich auf geschützten Makrocode nicht
mehr zugreifen kann?????
Vielleicht liegt das Mißverständnis auch in der Ungenauigkeit des Begriffes "Zugriff", dann übersetze den mit "Einblicknahme in den Quellcode erlangen", denn das ist es worum es im Kern geht.(*) OOo hingegen braucht den Quellcode nur um ihn in Maschinencode zu übersetzen, denn nur der (und nicht der Quellcode) wird ausgeführt.
Ob beim Verschlüsseln der Bibliotheken nun intern der Quellcode verschlüsselt wird oder bereits Maschinencode verschlüsselt wird, kann ich Dir nicht sagen (vermuten würde ich, wegen der Multiplattformfähigkeit, das tatsächlich der Quellcode verschlüsselt wird).
(*)
Du kannst das gerne selbst ausprobieren, beispielsweise ausgehend von einem Dokument welches die ungeschütze Bibliothek namens Standard enthält, welche in Module1 folgenden Code beinhaltet:
Code: Alles auswählen
Sub Test()
bibliotheken = ThisComponent.BasicLibraries
If bibliotheken.hasElements() Then
namen = bibliotheken.getElementNames()
For i = 0 to UBound(namen())
akt = bibliotheken.getByName(namen(i))
if akt.hasElements() then
if not BasicLibraries.isLibraryLoaded(namen(i)) then
if Not BasicLibraries.isLibraryPasswordProtected(namen(i)) then
BasicLibraries.Loadlibrary(namen(i))
end if
end if
akt_mod = akt.ElementNames()
for j = 0 to UBound(akt_mod())
Msgbox akt.getByName(akt_mod(j))
Next j
end if
next i
end if
End Sub
Sub geschuetztes_makro_ausfuehren()
BasicLibraries.LoadLibrary("Library1")
Main()
End Sub
und eine geschützte Bibliothek namens "Lbrary1" mit Module1:
Code: Alles auswählen
Sub Main
Msgbox "Ich bin ein Makro in einer geschützten Bibliothek"
End Sub
*Überzeuge Dich das Du Library1 nicht einsehen kannst (verzichte jedoch zunächst auf die Passworteingabe)
*starte Makro Test() und Du siehst den Code der ungeschützten Bibliothek, jedoch nicht den der geschützten
*starte Makro geschuetztes_makro_ausfuehren() um Dich zu überzeugen das das geschützte Makro trotzdem ausgeführt werden kann
*gib das Passwort für Library1 ein um den Code einsehen zu können
*starte nochmals Test() um jetzt zu sehen das auch der Code der zweiten Bibliothek sichtbar ist
Was Du nun mittels Passworteingabe manuell gemacht hast wäre genausogut im Makro Test() möglich mittels .verifyLibraryPassword(Name, Pass), wobei:
Name = Name der Bibliothek
Pass = Passwort
im Konkreten stellt sich die Frage nach dem Sinn, denn da das Passwort nun im ungeschützten Code steht, ist es einsehbar, allerdings wäre ja das Makro Test() auch in die geschütze Bibliothek zu verlagern und dann aus der ungeschützten nur aufzurufen.
Gruß
Stephan
Re: Fehler beim Anlegen ...
Hallo Stephan,
vielen, vielen Dank für die ausführliche Erläuterung.
Das Beispiel funktioniert einwandfrei.
Jetzt habe ich es verstanden.
Kurze Zusatzfrage.
Wenn der Macrocode nicht in Modul"1" sondern in Modul"xyz"" steht,
wie muss ich das untenstehende Macro ergänzen?
***********************************************************
Sub geschuetztes_makro_ausfuehren()
BasicLibraries.LoadLibrary("Library1")
Main()
End Sub
************************************************************
mfg
mike
vielen, vielen Dank für die ausführliche Erläuterung.
Das Beispiel funktioniert einwandfrei.
Jetzt habe ich es verstanden.

Kurze Zusatzfrage.
Wenn der Macrocode nicht in Modul"1" sondern in Modul"xyz"" steht,
wie muss ich das untenstehende Macro ergänzen?
***********************************************************
Sub geschuetztes_makro_ausfuehren()
BasicLibraries.LoadLibrary("Library1")
Main()
End Sub
************************************************************
mfg
mike
Re: Fehler beim Anlegen ...
Garnicht, es wird doch ohnehin die gesamte Bibliothek geladen, also alle Module der Bibliothek.Wenn der Macrocode nicht in Modul"1" sondern in Modul"xyz"" steht,
wie muss ich das untenstehende Macro ergänzen?
Nebenbei, denn Du fragst nicht danach:
sollte es nun in der Bibliothek ein Modul "Modul1" und ein Modul "Modulxyz" geben und in beiden stünde ein Makro namens Main(), so verwende zum Aufruf statt:
Code: Alles auswählen
Main()
Code: Alles auswählen
Modul1.Main()
Code: Alles auswählen
Modulxyz.Main()
Gruß
Stephan