Seite 2 von 2

Verfasst: 21.11.2007 21:13
von HJA
Hallo,

vielen dank für die Antworten.

Letzendlich ist meine Ursprungsfrage aber wohl zu verneinen.

Vielleicht noch zur Erklärung: ich stehe noch VOR der Entscheidung welchen Compiler ich nehme. Daher suche ich zunächst auch mal den, der meine Anforderungen möglichst gut abdeckt.

Das man bei jedem Compiler auch durch Drumherumarbeiten fehlendes ersetzen kann, bzw. nachbilden kann, ist mir nat. klar. So könnte ich den Dateizugriff z.B. über eine DLL realisieren, dann können soviele gleichzeitig schreibend zugreifen wie sie wollen.

Gruss
hja

[/quote][/code]

Verfasst: 22.11.2007 10:20
von Andreas
Geht schon, eine Datei shared zu öffnen. Dazu musst Du allerdings ein wenig WIN-API bemühen.
Über eine registrierte Message kannst Du dann auch die Position und Anzahl der Bytes in der Datei übermitteln,
an der eine Änderung eintrat, und dann darauf reagieren.
Versteht sich von selbst, dass das nur mit Deinen Programmen funktionieren kann !

Zum Testen hier mal 2 Programme die zur selben Zeit auf eine Textdatei zugreifen können.

Programm 1:

Code: Alles auswählen

Global message.l
Procedure WCB(wnd,msg,wparam,lparam)
    Result = #PB_ProcessPureBasicEvents
    Select Msg
    Case message
    Debug "geändert"
    Debug "Position : "+Str(wparam)
    Debug "Bytes    : "+Str(lparam)
    EndSelect
    ProcedureReturn Result
EndProcedure

hFile.l = CreateFile_("Test.txt", #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, 0,#OPEN_ALWAYS,#FILE_FLAG_OVERLAPPED,0)
If OpenWindow(0, #PB_Ignore,#PB_Ignore,640,480, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10,10,80,24,"OK")
  EndIf
  SetWindowCallback(@WCB())
  Message = RegisterWindowMessage_("aha")
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0
      ol.OVERLAPPED
      ol\Offset = 0
      WriteFile_(hFile,@"Shared1",7,@bw.l,ol)
      SendMessage_(#HWND_BROADCAST,Message,0,7)
      EndSelect
    Case #PB_Event_CloseWindow
      CloseHandle_(hFile)
      Quit = 1
    EndSelect
  Until Quit = 1
EndIf
End
Programm 2:

Code: Alles auswählen

Global message.l
Procedure WCB(wnd,msg,wparam,lparam)
    Result = #PB_ProcessPureBasicEvents
    Select Msg
    Case message
    Debug "geändert"
    Debug "Position : "+Str(wparam)
    Debug "Bytes    : "+Str(lparam)
    EndSelect
    ProcedureReturn Result
EndProcedure

hFile.l = CreateFile_("Test.txt", #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, 0,#OPEN_ALWAYS,#FILE_FLAG_OVERLAPPED,0)
If OpenWindow(0, #PB_Ignore,#PB_Ignore,640,480, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10,10,80,24,"OK")
  EndIf
  SetWindowCallback(@WCB())
  Message = RegisterWindowMessage_("aha")
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0
      ol.OVERLAPPED
      ol\Offset = 12
      WriteFile_(hFile,@"Shared2",7,@bw.l,ol)
      SendMessage_(#HWND_BROADCAST,Message,12,7)
      EndSelect
    Case #PB_Event_CloseWindow
      CloseHandle_(hFile)
      Quit = 1
    EndSelect
  Until Quit = 1
EndIf
End

Verfasst: 22.11.2007 11:41
von Thorium
Scarabol hat geschrieben: Ist aber relativ kompliziert -> Wer suchet der findet...
Was soll an Write Share kompliziert sein? Vieleicht gehts in dem Artikel noch um mehr. Man muss als Sharemode beim Öffnen lediglich FILE_SHARE_READ|FILE_SHARE_WRITE angeben. Wie im Source hier nachzulesen.

Ich sags immer wieder gerne, solcherart Informationen findet man in der MSDN

Verfasst: 22.11.2007 16:49
von HJA
Hallo,

Andreas, vielen Dank für Deine Mühe. Aber es ging mir wirklich nur darum herauszufinden, ob Purebasic das von Hause aus kann. Ich möchte soweit eben möglich alles ohne fremde Aufrufe erstellen. Da ich bisher nie einen Compiler nutzte der das nicht von Hause aus unterstützte, war ich halt überrascht und stellte daher die Frage.

Ohne Fremdaufrufe bleiben die Programme halt am flexibelsten. Normal ist nur die Syntax eine etwas andere. Früher nutze ich z.B. ein Programm um den Source von CP/M nach PC anzupassen, oder von einer Compilerversion zur nächsten. Das klappt halt alles nur, wenn nur die Syntax geändert werden muss.

Nochmals danke
Gruss
hja