Domino 9 und frühere Versionen > ND7: Entwicklung
Anhänge aus Richtextitem starten lassen
Demian:
Sorry, habe gerade gemerkt, dass ich zu Testzwecken das ByVal in der API beim 2.Parameter mal weggemacht hatte. Deswegen die Sonderzeichen. Wenn ich das ByVal wieder setze, funktioniert es aber auch nicht (siehe Screenshot). Er interpretiert dann 0 als neuen Dateinamen.
Gruß
Demian
Fedaykin:
Hallo Demian
Versuch mal die nicht mal MS bekannte API Funktion RemoveFileEx. ;D
Declare Function RemoveFileEx Lib "kernel32.dll" Alias "MoveFileExA"(Byval lpExistingFileName As String, Byval lpNewFileName As Long, Byval dwFlags As Long) As Boolean
Sub Tester()
Dim Success As Long
Success = RemoveFileEx("C:\temp\1.gif", 0, 4)
If Success = False Then Msgbox "Geht nicht"
End Sub
Gruss
Remo
Demian:
Moin Remo,
das klappt wunderbar ;D. Über RemoveFileEx bin ich im Netz auch schon gestoßen, da ich aber in der MSDN nichts dazu gefunden habe, hab ich lieber die Finger von gelassen.
Mein Code sieht jetzt folgendermaßen aus:
--- Code: ---(Declarations)
Declare Function RemoveFileEx Lib "kernel32.dll" Alias "MoveFileExA"(Byval lpExistingFileName As String, Byval lpNewFileName As Long, Byval dwFlags As Long) As Boolean
--- Ende Code ---
--- Code: ---Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
'**********************************************************************************************************************
'Hier wird der Start des Dateianhangs ausgeführt, indem der Anhang auf der Platte gespeichert und mittels
'WScript aufgerufen wird. Gleichzeitig wird durch die API RemoveFileEx (Abwandlung MoveFileEx) ein Eintrag
'in der Registry erzeugt, der dafür sorgt, dass die auf Platte kopierte Datei, bei Reboot gelöscht wird.
'**********************************************************************************************************************
'Allgemein
Dim s As New NotesSession
Dim doc As NotesDocument
Dim item As NotesRichTextItem
Dim obj As NotesEmbeddedObject
'Öffnen und Löschen der Datei
Dim WScript As Variant
Dim Datei As String
Dim Success As Boolean
'**********************************************************************************************************************
Set doc = source.Document
Set item = doc.GetFirstItem("Dateianhang")
Set obj = doc.GetAttachment(item.EmbeddedObjects(0).name)
Set WScript = CreateObject("Wscript.Shell")
'kopieren des Anhangs auf Platte
Call obj.ExtractFile("C:\" & item.EmbeddedObjects(0).name)
'Öffnen des Anhangs
WScript.Run("""C:\" & item.EmbeddedObjects(0).name & """")
'Registry-Eintrag für das Löschen der Datei bei Neustart des PC's
Datei = "C:\" & item.EmbeddedObjects(0).name
Success = RemoveFileEx(Datei, 0, 4)
If Success = False Then Msgbox "Die Datei muss manuell gelöscht werden", 64, "Fehler"
End Sub
--- Ende Code ---
Ich musste nur mit der Pfadangabe ein bisschen rumspielen, weil die API mit """C:\" & item.EmbeddedObjects(0).name & """" nicht klar kam, aber sonst funktioniert alles.
Aber im Endeffekt ist es doch dieselbe API-Funktion, oder? Wegen dem Alias.
Vielen Dank für deine Hilfe. Ich weiß gar nicht wieviele Stunden ich jetzt in diese blöde Funktion schon gesteckt hab.
Unbefriedigend ist aber trotzdem, dass ich nicht weiß wo das Problem mit MoveFileEx liegt. ???
Aber es funktioniert und das ist das Wichtigste.
Also vielen Dank nochmal.
Gruß
Demian
Fedaykin:
Hi Demian
Ist eigentlich auch fast die gleiche Declaration wie Deine. Nur habe Name abgeändert falls mal beide wo brauchen würdest und um zu zeigen Ups da hat aber wer etwas abgeändert. ;)
Ich habe da bei lpNewFileName ein Long daraus gemacht. Und so klappt, dass ich einfach eine 0 mitgebe. Und das ist genau das richtige. Glaube ist so, dass er da eigentlich einen Zeiger auf Speicherbereich will. Gibst Ihm einen NULL-Zeiger, dann reagiert das API anders und löscht (In Deinem Fall leere Zeile in Registry). Problem ist LotusScript initialisiert immer, VB und VBA kennt da noch den Unterschied zwischen "" und vbNullString.
Vielleicht interessiert das noch.
http://www.enzinger.net/NullStrg.html
Gruss
Remo
Demian:
...hüstel ::) Musste leider feststellen, dass das Ganze lokal wunderbar geht, aber bei Citrix-Notes versucht er auf die Registry des Servers zuzugreifen. Das ist zum einen nicht möglich, da der Zugriff gesperrt ist, zum andern würde das aber auch nichts bringen, weil die Dateien ja lokal bei den Usern liegen.
Was nun hab ich mir gedacht. Es muss doch möglich sein, vom Server aus auf die Registry des Users zuzugreifen.
Also habe ich mir eine Funktion gebastelt, die eine .reg Datei erstellt. Mein Code sieht jetzt wie folgt aus:
--- Code: ---Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
'**********************************************************************************************************************
'Hier wird der Start des Dateianhangs ausgeführt, indem der Anhang auf der Platte gespeichert und mittels
'WScript aufgerufen wird. Gleichzeitig wird durch die API RemoveFileEx (Abwandlung MoveFileEx) ein Eintrag
'in der Registry erzeugt, der dafür sorgt, dass die auf Platte kopierte Datei, bei Reboot gelöscht wird.
'**********************************************************************************************************************
'Allgemein
Dim s As New NotesSession
Dim doc As NotesDocument
Dim item As NotesRichTextItem
Dim obj As NotesEmbeddedObject
'Öffnen und Löschen der Datei
Dim WScript As Variant
Dim Datei As String
Dim Success As Boolean
'**********************************************************************************************************************
Set doc = source.Document
Set item = doc.GetFirstItem("Dateianhang")
Set obj = doc.GetAttachment(item.EmbeddedObjects(0).name)
Set WScript = CreateObject("Wscript.Shell")
Datei = "C:\" & item.EmbeddedObjects(0).name
'kopieren des Anhangs auf Platte
Call obj.ExtractFile(Datei)
'Öffnen des Anhangse
WScript.Run("""C:\" & item.EmbeddedObjects(0).name & """")
'Registry-Eintrag für das Löschen der Datei bei Neustart des PC's
Call RegDateiErstellen(Datei)
'WScript.Run("C:\WINDOWS\system32\regedt32.exe -s C:\Regtest.reg")
End Sub
--- Ende Code ---
--- Code: ---Sub RegDateiErstellen(Pfad As String)
'Dateibezogene Variablen
Dim Dateistream As Integer
'Freie Ddateinnummer suchen
DateiStream = Freefile()
'Datei erstellen
Open "C:\Regtest.reg" For Output Access Write As DateiStream
'Registry-Schlüssel in Datei schreiben
Print #DateiStream,"Windows Registry Editor Version 5.00"
Print #DateiStream,Chr(13)
Print #DateiStream, "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]"
Print #DateiStream,|"PendingFileRenameOperations"=hex(7):| & PfadInHex(Pfad)
'Erstellte Datei schließen
Close DateiStream
End Sub
--- Ende Code ---
--- Code: ---Function PfadInHex (Pfad As String) As String
Dim Anzahl As Long
'Der Pfadangabe steht immer \??\ bevor. Jedes Zeichen wird im Schlüssel mit einem Punkt (00) getrennt.
'In der .reg Datei wird jede Hexzahl mit einem Komma getrennt
PfadInHex = HexZahl("\") & ","
PfadInHex = PfadInHex & "00" & ","
PfadInHex = PfadInHex & HexZahl("?") & ","
PfadInHex = PfadInHex & "00" & ","
PfadInHex = PfadInHex & HexZahl("?") & ","
PfadInHex = PfadInHex & "00" & ","
PfadInHex = PfadInHex & HexZahl("\") & ","
PfadInHex = PfadInHex & "00" & ","
'jedes einzelnes Zeichen des Pfades umwandeln
Anzahl = Len(Pfad)
For i = 0 To Anzahl - 1
PfadInHex = PfadInHex & HexZahl(Mid(Pfad,i + 1,1)) & "," & "00" & ","
Next
'Dem letzten . der Pfadangabe stehen immer 6 weitere . nach (durch Komma getrennt)
PfadInHex = PfadInHex & "00" & "," & "00" & "," & "00" & "," & "00" & "," & "00" & "," & "00"
End Function
--- Ende Code ---
--- Code: ---Function HexZahl (Zeichen As String) As String
Hexzahl = Hex(Asc(Zeichen))
End Function
--- Ende Code ---
Die .reg wird auch wunderbar erstellt und funktioniert, wenn man sie lokal direkt ausführt. Also habe ich mir gedacht, ich erstelle eine .bat Datei mit folgender Zeile:
C:\Windows\System32\regedt32.exe -s C:\Regtest.reg.
Wenn man diese Datei von Citrix-Notes ausführt, versucht er aber trotzdem auf die Regiytry des Servers zuzugreifen. Obwohl ja explizit das lokale regedit des Users gestartet wird.
Warum wird trotzdem die Registry vom Server angesprochen? Gibt es überhaupt ne Möglichkeit auf die des Users zuzugreifen?
Gruß
Demian
PS: Auf http://www.enzinger.net/NullStrg.html bin ich auch irgendwann mal gestoßen, konnte das aber leider auch nicht so umsetzen.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln