Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Word (Office Programme von Microsoft)
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 29.09.2020, 13:42    Titel: Re: grindstone Antworten mit Zitat

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 grinsen ): 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 38

BeitragVerfasst am: 29.09.2020, 16:09    Titel: UEZ Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 38

BeitragVerfasst am: 29.09.2020, 16:19    Titel: zu grindstone Verfasst am: 29.09.2020, 14:42 Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 30.09.2020, 07:58    Titel: Re: zu grindstone Verfasst am: 29.09.2020, 14:42 Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 38

BeitragVerfasst am: 01.10.2020, 16:53    Titel: Re: Word (Office Programme von Microsoft) Antworten mit Zitat

[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
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 01.10.2020, 19:11    Titel: Re: Word (Office Programme von Microsoft) Antworten mit Zitat

[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, 11:27, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 38

BeitragVerfasst am: 03.10.2020, 18:19    Titel: Re: Word (Office Programme von Microsoft) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 04.10.2020, 11:22    Titel: Re: Word (Office Programme von Microsoft) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz