 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 29.09.2020, 14:42 Titel: Re: grindstone |
|
|
michaelblasin hat Folgendes geschrieben: | Dann kann man wohl nicht anfragen, ob ein Datenbereich einer Datei gesperrt ist (oder eine Datei gesperrt ist). Man sperrt den Dateibereich und sieht, ob die Sperre erfolgreich war oder nicht. |
Ich habe mal ein wenig mit der WinAPI herumgespielt. Das Sperren der Datei funktioniert, danach hat der Prozess, der die Sperre initiiert hat, die Datei für sich alleine. Die Sache hat allerdings einen Haken (irgendwas ist ja immer ): Auch die INPUT - Funktion von FB hat keinen Zugriff mehr, auch wenn sie im selben Prozess läuft, der Dateizugriff geht nur noch über ReadFile.
Zuerst ein Programmschnippsel, der ein Testfile generiert und es nur mit FB - Funktionen periodisch ausliest: Code: | Dim As String g, datei = "C:\testing.txt"
Open datei For Output As #1
Print #1, "Wenn einer einen Ast zersägt und damit einen Gast erlegt, dann wird das mit Knast belegt"
Close #1
Do
Open datei For Input As #1
Line Input #1, g
Print Timer; " "; Lof(1); " ";g
Close #1
Sleep 1000
Loop Until Len(InKey) |
Und hier der portierte und entsprechend modifizierte Schnippsel aus "File Locking with win32": Code: | #Include Once "windows.bi"
Function LockFileWin(datei As String) As Integer
Dim As HANDLE hFileHandle
Dim As BOOL bSuccess
Dim As ZString*256 szBuffer
'create New file
'With both reading And writing authority
'And reading And writing sharing
hFileHandle = CreateFile(datei, GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
0, OPEN_EXISTING, 0, 0)
Print "hFileHandle = ";hFileHandle
If hFileHandle = INVALID_HANDLE_VALUE Then
Print "Error creating handle to new file."
Return EXIT_FAILURE
EndIf
'Lock the file for the buffer length
bSuccess = LockFile(hFileHandle, 0, 0, SizeOf(szBuffer), 0)
If bSuccess Then
Print "File lock on "; datei; " secured."
Else
Print "File "; datei; " is already locked. Waiting for file to be unlocked"
Do
Sleep 1
bSuccess = LockFile(hFileHandle, 0, 0, SizeOf(szBuffer), 0)
Loop Until bSuccess
Print "File "; datei; " now is for exclusive use by this process"
EndIf
Dim As ZString*1024 text
Dim As Integer bytesread
Dim As OVERLAPPED ol
Do
If bytesread Then
ol.Offset += bytesread 'filepointer --> ab dieser position wird
ol.OffsetHigh = 0 ' die datei gelesen
Else
ol.Offset = 0
ol.OffsetHigh = 0
EndIf
ReadFile(hFileHandle, @text, 10, @bytesread, @ol)
Print Timer; " "; bytesread; " ";text
Sleep 1000
Loop Until Len(InKey)
'Now Let's release the lock
bSuccess = UnlockFile(hFileHandle, 0, 0, SizeOf(szBuffer), 0)
If bSuccess Then
Print "File lock on "; datei; " released."
EndIf
'Close the handle
CloseHandle(hFileHandle)
Return 0
End Function
Print LockFileWin("C:\testing.txt")
Sleep
|
Du kannst ihn auf einem oder mehreren Rechnern mehrfach starten und zusehen, wie sich die einzelnen Instanzen gegenseitig vom Zugriff ausschließen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 29.09.2020, 17:09 Titel: UEZ |
|
|
Hallo, danke für den Vorschlag
Du könntest doch eine Lock Datei mit dem PC Namen schreiben, sobald ein PC die Datei öffnet und lockt, z.B: ~PCName.lck
Es kann aber mehr als ein PC sein, der eben verschiedene Bereiche einer Random Datei sperrt
Natürlich müsstest du einige Dinge prüfen, ob z.B. das Lock File eine "Leiche" ist, falls der PC abgestürzt ist und die Datei nicht "Ungelockt" wurde, etc.
Beim Absturz müßte man also wissen, welche Dateien gesperrt sind, um sie beim Neustart wieder zu entsperren.
Ich habe früher einmal einiges mit einer komplett eigenen Lock Datei versucht und es hat ganz gut funktioniert. Bei der eigenen 'Lock Datei' kann ich anfragen,
welche Records gesperrt sind und welcher PC die Sperre veranlaßt hat.
Auf die Anfrage eines PC's erfolgt also entweder die Sperre und eine Meldung der erfolgreichen Sperre oder es gibt eine Fehlermeldung (daß die Sperre erfolglos war),
die dann vom anfragenden PC bearbeitet wird.
Beim Absturz weiß ich auch sofort, welche Dateien wie gesperrt sind.
Es sieht so aus, als wenn ich nicht darum herumkomme, dies weiterzuverfolgen (obwohl diese Lösung nicht die optimale ist, aber wenigstens funktioniert sie),
wenn ich nicht zu einem größerem EDV System wechseln will, das von Hard- und Software wirklich mehrplatzfähig ist. Aber niemand will dahin wechseln.
Ich glaube eigentlich, daß auch andere Forumsmitglieder an der Lösung mit meiner komplett eigenen Lock Datei interessiert wären.
Michael |
|
Nach oben |
|
 |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 29.09.2020, 17:19 Titel: zu grindstone Verfasst am: 29.09.2020, 14:42 |
|
|
Hallo,
Ich habe einen PC als Server deklariert und einen anderen als 'Client 1'.
Die Sperre funktioniert, wenn 'Client 1' eine Datei auf dem PC 'Server' sperrt, dann erkennt PC 'Server', daß die Datei gesperrt ist.
Ich habe es nicht ausprobiert, aber PC 'Server' könnte bestimmt die vom PC 'Client 1' gesperrte Datei entsperren und das darf nicht passieren.
Michael |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 30.09.2020, 08:58 Titel: Re: zu grindstone Verfasst am: 29.09.2020, 14:42 |
|
|
michaelblasin hat Folgendes geschrieben: | Ich habe es nicht ausprobiert, aber PC 'Server' könnte bestimmt die vom PC 'Client 1' gesperrte Datei entsperren und das darf nicht passieren. |
Das passiert auch nicht. Die Sperre ist einem bestimmten Prozess zugeordnet, und nur der Prozess, der die Sperre gesetzt hat, kann sie auch wieder lösen - gleichgültig, auf welchem Rechner er läuft. Auch beim Schließen des Filehandles wird die Datei wieder freigegeben, ebenso bei einem provozierten Absturz durch Zugriff auf einen Nullpointer oder Abschießen des Prozesses im Taskmanager.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 01.10.2020, 17:53 Titel: Re: Word (Office Programme von Microsoft) |
|
|
[quote="UEZ"] michaelblasin hat Folgendes geschrieben: | Hallo,
Kann man von einem Freebasic Programm aus das 'Word' (Office von Microsoft) aufrufen und ausführen ?
Michael
Ja, und zwar so:
[code]
'Coded by UEZ as proof of concept version
#Include Once "disphelper\disphelper.bi"
usw.
|
Windows nimmt bei meinem Test den Ordner 'Dokumente' und den Dateinamen 'Document1.doc', um die 'Word Datei' zu sichern.
Kann man den Dateinamen und den Ordner, in den man das 'Word document' speichern will, mit 'dishelper' anders definieren und 'Windows' nimmt dann diese Angaben ?
Mchael |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 01.10.2020, 20:11 Titel: Re: Word (Office Programme von Microsoft) |
|
|
[quote="michaelblasin"] UEZ hat Folgendes geschrieben: | michaelblasin hat Folgendes geschrieben: | Hallo,
Kann man von einem Freebasic Programm aus das 'Word' (Office von Microsoft) aufrufen und ausführen ?
Michael
Ja, und zwar so:
Code: |
'Coded by UEZ as proof of concept version
#Include Once "disphelper\disphelper.bi"
usw.
|
|
Windows nimmt bei meinem Test den Ordner 'Dokumente' und den Dateinamen 'Document1.doc', um die 'Word Datei' zu sichern.
Kann man den Dateinamen und den Ordner, in den man das 'Word document' speichern will, mit 'dishelper' anders definieren und 'Windows' nimmt dann diese Angaben ?
Mchael |
Du kannst diese Function dazu benutzen:
Code: |
Sub Word_SaveDoc(sFilename As String)
dhCallMethod(__oWordAppl, ".ActiveDocument.SaveAs(%s)", sFilename)
End Sub
|
_________________ Gruß,
UEZ
Zuletzt bearbeitet von UEZ am 04.10.2020, 12:27, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 03.10.2020, 19:19 Titel: Re: Word (Office Programme von Microsoft) |
|
|
michaelblasin (zu UEZ) hat Folgendes geschrieben: |
Hallo,
Windows nimmt bei meinem Test den Ordner 'Dokumente' und den Dateinamen 'Document1.doc', um die 'Word Datei' zu sichern.
Kann man den Dateinamen und den Ordner, in den man das 'Word document' speichern will, mit 'dishelper' anders definieren und 'Windows' nimmt dann diese Angaben ?
Michael |
Du kannst diese Function dazu benutzen:
Code: | [/quote]
Sub Word_SaveDoc(sFilename As String)
dhCallMethod(__oWordAppl, ".ActiveDocument.SaveAs(%s)", sFilename)
End Sub
|
Das funktioniert. Eine neue Worddatei 'sFilename' wird erstellt und in den Ordner 'Dokumente' geschrieben.
Ich muß eine bereits existierende Datei 'Angaben.001.doc' im Ordner 'Info.010' öffnen, ändern und sichern.
Ich habe mir zwar 'Autoit' angesehen, aber nichts über dieses Thema gefunden.
Michael |
|
Nach oben |
|
 |
UEZ

Anmeldungsdatum: 24.06.2016 Beiträge: 137 Wohnort: Opel Stadt
|
Verfasst am: 04.10.2020, 12:22 Titel: Re: Word (Office Programme von Microsoft) |
|
|
michaelblasin hat Folgendes geschrieben: | michaelblasin (zu UEZ) hat Folgendes geschrieben: |
Hallo,
Windows nimmt bei meinem Test den Ordner 'Dokumente' und den Dateinamen 'Document1.doc', um die 'Word Datei' zu sichern.
Kann man den Dateinamen und den Ordner, in den man das 'Word document' speichern will, mit 'dishelper' anders definieren und 'Windows' nimmt dann diese Angaben ?
Michael |
Du kannst diese Function dazu benutzen:
Code: | [/quote]
Sub Word_SaveDoc(sFilename As String)
dhCallMethod(__oWordAppl, ".ActiveDocument.SaveAs(%s)", sFilename)
End Sub
|
Das funktioniert. Eine neue Worddatei 'sFilename' wird erstellt und in den Ordner 'Dokumente' geschrieben.
Ich muß eine bereits existierende Datei 'Angaben.001.doc' im Ordner 'Info.010' öffnen, ändern und sichern.
Ich habe mir zwar 'Autoit' angesehen, aber nichts über dieses Thema gefunden.
Michael |
AutoIt angesehen? Was meinst du damit? Hast du AutoIt installiert und nicht dazu gefunden oder nur im Forum nachgeschaut?
Du solltest AutoIt und das komplette SciTE Paket installieren, um die Office Programme (Excel, Word und PowerPoint) Automatisation nutzen zu können.
Erst AutoIt installieren, dann SciTE.
Anschließend den Source Code in den Editor kopieren, speichern und mit F5 starten.
Beispiel aus der Hilfe Datei:
Code: |
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Word.au3>
; Copy \Extras\Test.doc to @TempDir
If FileCopy(@ScriptDir & "\Extras\Test.doc", @TempDir & "\_Word_Test.doc", $FC_OVERWRITE) = 0 Then Exit MsgBox($MB_SYSTEMMODAL, _
"Word UDF: _Word_DocSaveAs Example", "Couldn't copy '.\Extras\Test.doc' as '_Word_Test.doc' to the @TempDir directory.")
; Create application object
Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
"Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; Open the test document
Local $oDoc = _Word_DocOpen($oWord, @TempDir & "\_Word_Test.doc")
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
"Error opening '_Word_Test.doc'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; Save the document as _Word_Test2.doc
; Insert text at the beginning
Local $oRange = _Word_DocRangeSet($oDoc, -1)
$oRange.Text = "Bold text at the beginning. "
$oRange.Bold = True
; Save document
_Word_DocSaveAs($oDoc, @TempDir & "\_Word_Test2.doc")
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", _
"Error saving the Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocSaveAs Example", "Document successfully saved as '" & _
@TempDir & "\_Word_Test2.doc'.")
|
Mit F1 kannst du die Hilfe Datei öffnen. _________________ Gruß,
UEZ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|