Op´s lock

Von der Installation bis zur Auslieferung der Applikation

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Op´s lock

Beitrag von AUGE_OHR »

hi,

schon wieder mal gab es die Nachfrage im Alaska Forum und deshalb
hier der ganze Xbase++ Code den ich benutzte zusammen mit der
RegClass von Thomas Braun.
Mit dem Tool kann man kontrollieren ob man die Opportunistic locking
Registry Einträge vorhanden sind und ggf. anlegen/korrigieren.

was NICHT funktioniert ist die "wiederherstellung", welches evtl. ein
löschen von angelegten Einträgen beinhaltet, der Registry also vorher
ein BACKUP anfertigen !!!

die Einträge werden so mit einem W2003 Server und W2K/XP Work-
stationen betrieben und laufen (scheinbar) stabil. Trotzdem übernehme
ich hierfür keine "Garantie" wenn jemand mit diesen Einstellungen
Probleme haben sollte.

Wenn jemand noch einen Eintrag weiss möge er den doch bitte in diesem
Thread kundtun damit wir alles was davon haben.

gruss by OHR
Jimmy

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#pragma Library( "XBTBASE1.LIB" )

STATIC cServer := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters"
STATIC cWorkst := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters"
STATIC cSMB    := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRxSmb\Parameters"

CLASS NewForm FROM _NewForm
   EXPORTED:
      METHOD init
      METHOD create
ENDCLASS

METHOD NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   * Methode der Superklasse rufen
   ::_NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self

METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
   * Methode der Superklasse rufen
   ::_NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
   * Datenbanken öffnen und Workareas auswählen
   ::OPSLOCK := Select()
   * Werte in Editcontrols übertragen
   AEval ( ::EditControls, { | oXbp | oXbp:SetData() } )
   * Formular anzeigen
   ::show()

RETURN self

******************************************************************************
* Main Prozedur zum Testen des Formulars
******************************************************************************
PROCEDURE APPSYS
RETURN

PROCEDURE Main
LOCAL nEvent, oXbp, mp1, mp2
LOCAL datei   := "OPSLOCK.DBF"
LOCAL oForm

   IF .NOT. FILE(datei)
      C_OPSLOCK(datei)
   ENDIF

   USE (datei) EXCLUSIV
   SET INDEX TO OPSINDEX

*   REGCOMPARE()
   REGSTATUS()

   oForm := NewForm():New():Create()
   COL2BROW(oForm)
   SetAppFocus( oForm:oBrowse )

   SLEEP(5)
   GO BOTTOM
   oForm:oBrowse:RefreshAll()
   SLEEP(5)
   GO TOP
   oForm:oBrowse:RefreshAll()

*   DO WHILE .NOT. oForm:oBrowse:forceStable()
*      SLEEP(5)
*   ENDDO

   nEvent := xbe_None
   WHILE nEvent != xbeP_Close
      nEvent := AppEvent ( @mp1, @mp2, @oXbp )
      oXbp:HandleEvent ( nEvent, mp1, mp2 )
      IF nEvent == xbeP_Quit
         QUIT   // AppQuit()
      ENDIF
   ENDDO

RETURN

******************************************************************************
*
******************************************************************************
FUNCTION C_OPSLOCK(datei)
LOCAL field_list:={}
LOCAL aKeys   := {}
LOCAL i, iMax := 0

  IF !FILE(datei)
    aadd(field_list,{"ACTIVE"  ,"L",  1,0})
    aadd(field_list,{"SOW"     ,"C",  1,0})
    aadd(field_list,{"HKLM"    ,"C",200,0})
    aadd(field_list,{"KEY"     ,"C", 70,0})
    aadd(field_list,{"DWORD"   ,"C",  8,0})
    aadd(field_list,{"ISTDWORD","C",  8,0})
    aadd(field_list,{"ORGDWORD","C",  8,0})
    aadd(field_list,{"COMMENT" ,"C",200,0})

    DBCREATE(datei,field_list)
  endif
  USE (datei) EXCLUSIV
  //
  // Server
  //
  AADD(aKeys,{"S","A","autodisconnect"             ,"ffffffff"})
  AADD(aKeys,{"S","A","ConnectionNoSessionsTimeout","ffffffff"})
  AADD(aKeys,{"S","A","CachedOpenLimit"             ,"0"})
  AADD(aKeys,{"S","A","EnableOpLockForceClose"     ,"1"})
  AADD(aKeys,{"S","A","EnableOpLocks"              ,"0"})
  AADD(aKeys,{"S","A","OplocksDisabled"            ,"1"})
  //
  // VISTA "Server"
  //
  AADD(aKeys,{"S","A","SMB2"                       ,"0"})
  //
  //
  // Server W2K SMB
  //
  AADD(aKeys,{"T","A","OplocksDisabled"            ,"1"})
  //

  // Workstation
  //
  AADD(aKeys,{"W","A","CachedOpenLimit"            ,"0"})
  AADD(aKeys,{"W","A","EnableOpLockForceClose"     ,"1"})
  AADD(aKeys,{"W","A","EnableOpLocks"              ,"0"})
  AADD(aKeys,{"W","A","OplocksDisabled"            ,"1"})
  AADD(aKeys,{"W","A","UseLockReadUnlock"          ,"0"})
  AADD(aKeys,{"W","A","UseUnlockBehind"            ,"1"})
  AADD(aKeys,{"W","A","UseOpportunisticLocking"     ,"0"})   // UseOpp (2x "p")
  AADD(aKeys,{"W","A","UtilizeNtCaching"           ,"0"})

  iMax := LEN(aKeys)
  FOR i = 1 TO iMax
      APPEND BLANK
      REPLACE SOW      WITH aKeys[i][1]
      REPLACE HKLM     WITH IF(aKeys[i][1]="S",cServer,IF(aKeys[i][1]="W",cWorkst,cSMB))
      REPLACE KEY      WITH aKeys[i][3]
      REPLACE DWORD    WITH aKeys[i][4]
      REPLACE COMMENT  WITH ""
      REPLACE ACTIVE   WITH .F.

      REPLACE ISTDWORD WITH ""
      REPLACE ORGDWORD WITH ""
  NEXT
  INDEX ON UPPER(SOW+KEY) TO OPSINDEX

  //
  // save original Registry Value
  //
  REGORIGIN()

  CLOSE

RETURN(.t.)

FUNCTION GETREGKEY(cHKLM,cKEY)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := ""
   IF oReg:Status()
      oReg:ReadBinType := "C"
      cRet := oReg:GetValue(cKEY)
   ENDIF
RETURN cRet

FUNCTION SETREGKEY(cHKLM,cKEY,cDWORD)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := ""
   IF .NOT. oReg:Status()
      oReg:Create()
   ENDIF

   cRet := oReg:SetValue(cKEY,cDWORD)
RETURN cRet

FUNCTION DELREGKEY(cHKLM,cKEY)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := .F.
   IF oReg:Status()
*      cRet := oReg:DelKey(cKEY)
      cRet := oReg:DelValue(cKEY)
   ENDIF
RETURN cRet

FUNCTION EXISTKEY(cHKLM)
LOCAL oReg := XbpReg():NEW(cHKLM)
RETURN oReg:status()

FUNCTION SHOWVALUE(cHKLM)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL aRet := {}
   IF oReg:Status()
      aRet := oReg:ValueList(.F.)
   ENDIF
RETURN aRet

FUNCTION REF2GETS(aEditcontrols)
LOCAL n, LenGets := len(aEditcontrols)
   FOR n := 1 to LenGets
       aEditcontrols[n]:setdata()               // now VarBlock:setdata()
       aEditcontrols[n]:show()                  // let me see my VarBlock now
   NEXT
RETURN NIL

FUNCTION COL2BROW(oForm)
LOCAL oBrowse := oForm:oBrowse
LOCAL oCol

   oCol := oBrowse:addColumn({|| OPSLOCK->ACTIVE }, 1,""     )
   oCol:ColorBlock := {|| IF(OPSLOCK->ACTIVE  , { GRA_CLR_WHITE ,GRA_CLR_DARKGREEN}, { GRA_CLR_BLACK,GRA_CLR_PALEGRAY } ) }
   oCol:configure()

   oCol := oBrowse:addColumn({|| OPSLOCK->SOW    }, 1,""     )
   oCol:ColorBlock := {|| IF(OPSLOCK->SOW="S" , { GRA_CLR_YELLOW,GRA_CLR_PINK     }, ;
                          IF(OPSLOCK->SOW="T" , { GRA_CLR_WHITE ,GRA_CLR_DARKPINK }, ;
                          IF(OPSLOCK->SOW="W" , { GRA_CLR_BLACK ,GRA_CLR_CYAN}, ;
                          IF(OPSLOCK->SOW=" " , { GRA_CLR_WHITE ,GRA_CLR_RED      }, ;
                                                { GRA_CLR_BLACK ,GRA_CLR_PALEGRAY } )))) }
   oCol:configure()

   oBrowse:addColumn({|| OPSLOCK->HKLM     },45,"HKLM"  )
   oBrowse:addColumn({|| OPSLOCK->KEY      },11,"KEY"   )
   oBrowse:addColumn({|| OPSLOCK->DWORD    }, 4,"DWord" )
   oBrowse:addColumn({|| OPSLOCK->ISTDWORD }, 4,"ist"   )
   oBrowse:addColumn({|| OPSLOCK->ORGDWORD }, 4,"Org"   )
*   oBrowse:addColumn({|| OPSLOCK->COMMENT}, 2,"Comment")

RETURN NIL

FUNCTION CENTERPOS( aSize, aRefSize )
RETURN { Int( (aRefSize[1] - aSize[1]) / 2 ) ;
       , Int( (aRefSize[2] - aSize[2]) / 2 ) }

FUNCTION SETSHOW(cHKLM,cKEY,cDWORD)
LOCAL cHKLM1 := TRIM(cHKLM)
LOCAL cKEY1  := TRIM(cKEY)
LOCAL nDWORD
LOCAL lOrgin := .F.


      IF VAL(cDWORD) > 0
         nDWORD  := VAL(cDWORD)
      ELSE
         IF EMPTY(cDWORD)
            lOrgin := .T.
         ELSE
            IF UPPER(SUBSTR(cDWORD,1,1)) $ "ACBDEF"
               nDWORD  := VAL(StrToHex(UPPER(cDWORD)))
               IF nDWORD > 99999999
                  nDWORD := 99999999
               ENDIF
            ELSE
               nDWORD  := VAL(cDWORD)
            ENDIF
         ENDIF
      ENDIF

      ALTD()

      IF lOrgin
         IF EMPTY(OPSLOCK->ORGDWORD)
            DELREGKEY(cHKLM1,cKEY1)
         ENDIF
      ELSE
         SETREGKEY(cHKLM1,cKEY1,nDWORD)
      ENDIF

      cDWORD := GETREGKEY(TRIM(cHKLM1),TRIM(cKEY1))
      REPLACE OPSLOCK->ACTIVE   WITH .T.
      DO CASE
         CASE VALTYPE(cDWORD) = "C"
         CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
         CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
      OTHERWISE
         cDWORD := ""
         REPLACE OPSLOCK->ACTIVE   WITH .F.
      ENDCASE
      REPLACE OPSLOCK->ISTDWORD WITH cDWORD

RETURN NIL

FUNCTION REGSTATUS()
LOCAL cDWORD

   GO TOP
   DO WHILE !EOF()
      cDWORD := GETREGKEY(TRIM(OPSLOCK->HKLM),TRIM(OPSLOCK->KEY))

      REPLACE OPSLOCK->ACTIVE   WITH .T.
      DO CASE
         CASE VALTYPE(cDWORD) = "C"
         CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
         CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
      OTHERWISE
         cDWORD := ""
         REPLACE OPSLOCK->ACTIVE   WITH .F.
      ENDCASE
      REPLACE OPSLOCK->ISTDWORD WITH cDWORD

      SKIP
   ENDDO
   GO TOP

RETURN NIL

FUNCTION REGORIGIN()
LOCAL cDWORD

   GO TOP
   DO WHILE !EOF()
      cDWORD := GETREGKEY(TRIM(OPSLOCK->HKLM),TRIM(OPSLOCK->KEY))
      DO CASE
         CASE VALTYPE(cDWORD) = "C"
         CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
//
// hier gibt es Probleme ...
//
         CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
      OTHERWISE
         cDWORD := ""
      ENDCASE
      REPLACE OPSLOCK->ORGDWORD WITH cDWORD

      SKIP
   ENDDO
   GO TOP

RETURN NIL

FUNCTION REGCOMPARE()
LOCAL aServer
LOCAL aSMB
LOCAL aWorkst
LOCAL i,iMax,cSeek
LOCAL cDWORD

ALTD()
   aServer := SHOWVALUE(cServer)
   aSMB    := SHOWVALUE(cSMB   )
   aWorkst := SHOWVALUE(cWorkst)

   iMax := LEN(aServer)
   FOR i = 1 TO iMax
      cSeek := "S"+aServer[i][1]
      SEEK(UPPER(cSeek))
      IF FOUND()
      ELSE
         cDWORD := GETREGKEY(cServer,aServer[i][1])
*         cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB
         DO CASE
            CASE VALTYPE(cDWORD) = "C"
            CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
            CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
         OTHERWISE
            cDWORD := ""
         ENDCASE

         APPEND BLANK
         REPLACE SOW      WITH "S"
         REPLACE HKLM     WITH cServer
         REPLACE KEY      WITH aServer[i][1]
         REPLACE DWORD    WITH cDWORD
         REPLACE COMMENT  WITH "found by Xbase++"
         REPLACE ACTIVE   WITH .T.
         REPLACE ISTDWORD WITH cDWORD
         REPLACE ORGDWORD WITH cDWORD
      ENDIF
   NEXT

   iMax := LEN(aSMB   )
   FOR i = 1 TO iMax
      cSeek := "T"+aSMB[i][1]
      SEEK(UPPER(cSeek))
      IF FOUND()
      ELSE
         cDWORD := GETREGKEY(cSMB,aSMB[i][1])
*         cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB

         DO CASE
            CASE VALTYPE(cDWORD) = "C"
            CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
            CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
         OTHERWISE
            cDWORD := ""
         ENDCASE

         APPEND BLANK
         REPLACE SOW      WITH "T"
         REPLACE HKLM     WITH cSMB
         REPLACE KEY      WITH aSMB[i][1]
         REPLACE DWORD    WITH cDWORD
         REPLACE COMMENT  WITH "found by Xbase++"
         REPLACE ACTIVE   WITH .T.
         REPLACE ISTDWORD WITH cDWORD
         REPLACE ORGDWORD WITH cDWORD
      ENDIF
   NEXT

   iMax := LEN(aWorkst)
   FOR i = 1 TO iMax
      cSeek := "W"+aWorkst[i][1]
      SEEK(UPPER(cSeek))
      IF FOUND()
      ELSE
         cDWORD := GETREGKEY(cWorkst,aWorkst[i][1])
*         cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB

         DO CASE
            CASE VALTYPE(cDWORD) = "C"
            CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
            CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
         OTHERWISE
            cDWORD := ""
         ENDCASE

         APPEND BLANK
         REPLACE SOW      WITH "W"
         REPLACE HKLM     WITH cWorkst
         REPLACE KEY      WITH aWorkst[i][1]
         REPLACE DWORD    WITH cDWORD
         REPLACE COMMENT  WITH "found by Xbase++"
         REPLACE ACTIVE   WITH .T.
         REPLACE ISTDWORD WITH cDWORD
         REPLACE ORGDWORD WITH cDWORD
      ENDIF
   NEXT

RETURN NIL

FUNCTION WRITENOW(aEditcontrols)
LOCAL n, LenGets := len(aEditcontrols)
   FOR n := 1 to LenGets
       aEditcontrols[n]:getdata()               // now VarBlock:GETdata()
       aEditcontrols[n]:show()                  // let me see my VarBlock now
   NEXT
RETURN NIL

FUNCTION SSCOPE(nNum,oBrowse)
   DO CASE
      CASE nNum = 1 ; SET SCOPE TO
      CASE nNum = 2 ; SET SCOPETOP TO "S" ; SET SCOPEBOTTOM TO "T"
      CASE nNum = 3 ; SET SCOPE TO "W"
   ENDCASE
   GO TOP
   oBrowse:refreshAll()

RETURN NIL

//EOF

geändert :
AADD(aKeys,{"W","A","UseOportunisticLocking" ,"0"})
muss

Code: Alles auswählen

AADD(aKeys,{"W","A","UseOpportunisticLocking"     ,"0"})
heissen. man beachte die UseOpportunisticLocking (2x "p")
Zuletzt geändert von AUGE_OHR am Sa, 08. Mai 2010 8:06, insgesamt 1-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

ups hab die "Form" vergessen.

edit : der Code war "abgeschnitten" ?, also nochmals.

Code: Alles auswählen

#ifndef _NEWFORM_
#define _NEWFORM_

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#pragma Library( "XppUi2.lib" )

CLASS _NewForm FROM XbpDialog
   EXPORTED:
      VAR editControls

      * Enthaltene Kontrollelemente
      VAR oBrowse
      VAR Sow
      VAR Hklm
      VAR Active
      VAR Static3
      VAR Key
      VAR Static4
      VAR Static4a
      VAR Static4b

      VAR Dword
      VAR ISTDWORD
      VAR ORGDWORD

      VAR Static5
      VAR Static5a
      VAR Comment
      VAR ButtonApply
      VAR ButtonNew
      VAR ButtonOrg
      VAR Static6
      VAR RadioServer
      VAR RadioWorkst
      VAR RadioAlle
      VAR ButtonOK

      * Alias Bezeichner
      VAR OPSLOCK

      METHOD init
      METHOD create
ENDCLASS

METHOD _NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )

   DEFAULT oParent  TO AppDesktop(), ;
           aPos     TO {92,152}, ;
           aSize    TO {800,502}, ;
           lVisible TO .F.

   DEFAULT aPP TO { { XBP_PP_COL_HA_CAPTION         , "Kd.Nr. "        }, ;
                    { XBP_PP_COL_FA_CAPTION          , ""               }, ;
                    { XBP_PP_COL_HA_BGCLR            , GRA_CLR_PALEGRAY }, ;
                    { XBP_PP_COL_HA_FGCLR            , GRA_CLR_BLACK    }, ;
                    { XBP_PP_COL_FA_BGCLR            , GRA_CLR_PALEGRAY }, ;
                    { XBP_PP_COL_FA_FGCLR            , GRA_CLR_BLACK    }, ;
                    { XBP_PP_COL_DA_BGCLR            , GRA_CLR_WHITE    }, ;
                    { XBP_PP_COL_DA_FGCLR            , GRA_CLR_BLACK    }, ;
                    { XBP_PP_COL_DA_HILITE_FGCLR     , XBPSYSCLR_HILITEFOREGROUND }, ;
                    { XBP_PP_COL_DA_HILITE_BGCLR     , XBPSYSCLR_HILITEBACKGROUND }, ;
                    { XBP_PP_COL_DA_CHARWIDTH        , 1                }, ;
                    { XBP_PP_COL_DA_CELLALIGNMENT    , XBPALIGN_LEFT    }  }

   AAdd ( aPP,      { XBP_PP_COMPOUNDNAME            , "8.Arial" } )

   aPos := CenterPos( aSize, AppDesktop():currentSize() )

   ::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpDialog:taskList := .T.
   ::XbpDialog:title := "Xbase++ Ops lock settings"

   ::editControls := {}

   ::oBrowse      := XbpBrowse():new( ::drawingArea, , {12,188}, {765,267} )
   // Navigationscodebl”cke fr den Browser
   ::oBrowse:skipBlock     := {|n| DbSkipper(n) }
   ::oBrowse:goTopBlock    := {| | DbGoTop()    }
   ::oBrowse:goBottomBlock := {| | DbGoBottom() }
   ::oBrowse:phyPosBlock   := {| | Recno()      }
   // Navigationscodebl”cke fr den vertikalen Scrollbar
   ::oBrowse:posBlock      := {| | DbPosition()    }
   ::oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
   ::oBrowse:lastPosBlock  := {| | 100             }
   ::oBrowse:firstPosBlock := {| | 0               }

   ::oBrowse:hScroll       := .F.
   ::oBrowse:cursorMode    := XBPBRW_CURSOR_ROW
   ::oBrowse:stableblock   := {|| Ref2Gets(::EditControls ) }

   ::Active       := XbpCheckBox():new( ::drawingArea, , {12,148}, {20,24} )
   ::Active:tabStop := .T.
   ::Active:dataLink  := {|x| IIf( PCOUNT()==0, (::OPSLOCK)->ACTIVE         , (::OPSLOCK)->ACTIVE  := x ) }
   AAdd( ::editControls, ::Active )

   ::Sow          := XbpSLE():new( ::drawingArea, , { 32,148}, { 16,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::Sow:bufferLength := 1
   ::Sow:tabStop := .T.
   ::Sow:dataLink     := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->SOW )    , (::OPSLOCK)->SOW     := x ) }
   AAdd( ::editControls, ::Sow )

   ::Hklm         := XbpSLE():new( ::drawingArea, , { 64-12,148}, {712+12,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::Hklm:bufferLength := 250
   ::Hklm:tabStop := .T.
   ::Hklm:dataLink    := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->HKLM )   , (::OPSLOCK)->HKLM    := x ) }
   AAdd( ::editControls, ::Hklm )

   ::Static3      := XbpStatic():new( ::drawingArea, , {32-12,120}, {28,24} )
   ::Static3:caption := "Key:"
   ::Static3:clipSiblings := .T.
   ::Static3:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT

   ::Key          := XbpSLE():new( ::drawingArea, , { 64-12,120}, {236+12,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::Key:bufferLength := 70
   ::Key:tabStop := .T.
   ::Key:dataLink     := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->KEY )    , (::OPSLOCK)->KEY     := x ) }
   AAdd( ::editControls, ::Key )

   ::Static4      := XbpStatic():new( ::drawingArea, , {308,120}, {40,24} )
   ::Static4:caption := "Dword:"
   ::Static4:clipSiblings := .T.
   ::Static4:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT

   ::Dword        := XbpSLE():new( ::drawingArea, , {352,120}, { 64,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::Dword:bufferLength := 8
   ::Dword:tabStop := .T.
   ::Dword:dataLink   := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->DWORD )  , (::OPSLOCK)->DWORD   := x ) }
   AAdd( ::editControls, ::Dword )

*************
   ::Static4a      := XbpStatic():new( ::drawingArea, , {580,120}, {30,24} )
   ::Static4a:caption := "Ist:"
   ::Static4a:clipSiblings := .T.
   ::Static4a:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT

   ::ISTDWORD     := XbpSLE():new( ::drawingArea, , {610,120}, { 64,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::ISTDWORD:bufferLength := 8
   ::ISTDWORD:tabStop := .T.
   ::ISTDWORD:dataLink   := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->ISTDWORD )  , (::OPSLOCK)->ISTDWORD   := x ) }
   ::ISTDWORD:editable := .F.
   AAdd( ::editControls, ::ISTDWORD )

   ::Static4b      := XbpStatic():new( ::drawingArea, , {682,120}, {30,24} )
   ::Static4b:caption := "Org:"
   ::Static4b:clipSiblings := .T.
   ::Static4b:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT

   ::ORGDWORD     := XbpSLE():new( ::drawingArea, , {712,120}, { 64,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::ORGDWORD:bufferLength := 8
   ::ORGDWORD:tabStop := .T.
   ::ORGDWORD:dataLink   := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->ORGDWORD )  , (::OPSLOCK)->ORGDWORD   := x ) }
   ::ORGDWORD:editable := .F.
   AAdd( ::editControls, ::ORGDWORD )

*************
   ::Static5      := XbpStatic():new( ::drawingArea, , {12-12,88}, {48,24} )
   ::Static5:caption := "Note"
   ::Static5:clipSiblings := .T.
   ::Static5:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT

   ::Comment      := XbpSLE():new( ::drawingArea, , { 64-12, 88}, {712+12,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::Comment:bufferLength := 77
   ::Comment:tabStop := .T.
   ::Comment:dataLink := {|x| IIf( PCOUNT()==0, Trim( (::OPSLOCK)->COMMENT ), (::OPSLOCK)->COMMENT := x ) }
   AAdd( ::editControls, ::Comment )

   ::Static5a      := XbpStatic():new( ::drawingArea, , {12,10}, {334,76} )
   ::Static5a:caption := ""
   ::Static5a:clipSiblings := .T.
   ::Static5a:type := XBPSTATIC_TYPE_GROUPBOX

   ::ButtonApply  := XbpPushButton():new( ::Static5a, , {  8-4,20-12}, {100,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::ButtonApply:caption := "Anwenden"
   ::ButtonApply:tabStop := .T.
   ::ButtonApply:activate  := {|| SETSHOW(::Hklm:Getdata(),::Key:Getdata(),::Dword:Getdata())    ,::oBrowse:RefreshCurrent() }

   ::ButtonNew  := XbpPushButton():new( ::Static5a, , {120-4,20-12}, {100,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::ButtonNew:caption := "Neu"
   ::ButtonNew:tabStop := .T.
   ::ButtonNew:activate    := {|| ::oBrowse:RefreshAll() }

************
   ::ButtonOrg  := XbpPushButton():new( ::Static5a, , {120+112-4,20-12}, {100,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::ButtonOrg:caption := "Origin"
   ::ButtonOrg:tabStop := .T.
   ::ButtonOrg:activate    := {|| SETSHOW(::Hklm:Getdata(),::Key:Getdata(),::ORGDWORD:Getdata()) ,::oBrowse:RefreshCurrent() }

************
   ::Static6      := XbpStatic():new( ::drawingArea, , {300+44,10}, {128,76} )
   ::Static6:caption := ""
   ::Static6:clipSiblings := .T.
   ::Static6:type := XBPSTATIC_TYPE_GROUPBOX

   ::RadioAlle := XbpRadioButton():new(   ::Static6, , {4,40}, {120,20} )
   ::RadioAlle:caption := "Alle"
   ::RadioAlle:selection := .T.
   ::RadioAlle:tabStop := .T.
   ::RadioAlle:selected   := {|| SSCOPE(1,::oBrowse) }

   ::RadioServer := XbpRadioButton():new( ::Static6, , {4,22}, {120,20} )
   ::RadioServer:caption := "Server"
   ::RadioServer:selection := .F.
   ::RadioServer:tabStop := .T.
   ::RadioServer:selected := {|| SSCOPE(2,::oBrowse) }

   ::RadioWorkst := XbpRadioButton():new( ::Static6, , {4, 4}, {120,20} )
   ::RadioWorkst:caption := "Workstation"
   ::RadioWorkst:selection := .F.
   ::RadioWorkst:tabStop := .T.
   ::RadioWorkst:selected := {|| SSCOPE(3,::oBrowse) }

   ::ButtonOK     := XbpPushButton():new( ::drawingArea, , {670,20}, {100,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::ButtonOK:caption := "Exit"
   ::ButtonOK:tabStop := .T.
   ::ButtonOK:activate     := {|| PostAppEvent( xbeP_Close ) }

RETURN self


******************************************************************************
* Systemresourcen anfordern
******************************************************************************
METHOD _NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   ::oBrowse:create()

   ::Sow:create()

   ::Active:create()
   ::Hklm:create()

   ::Static3:create()
   ::Key:create()

   ::Static4:create()
   ::Static4a:create()
   ::Static4b:create()

   ::Dword:create()
   ::ISTDWORD:create()
   ::ORGDWORD:create()

   ::Static5:create()
   ::Comment:create()

   ::Static5a:create()
   ::ButtonApply:create()
   ::ButtonNew:create()
   ::ButtonOrg:create()

   ::Static6:create()
   ::RadioAlle:create()
   ::RadioServer:create()
   ::RadioWorkst:create()

   ::ButtonOK:create()

RETURN self

#endif

//EOF
Zuletzt geändert von AUGE_OHR am Di, 08. Jun 2010 16:54, insgesamt 1-mal geändert.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

und das ganze für eXPress++ umgesetzt

Beitrag von Rudolf »

function setregkeys(cSys)
******************************************************************
local cServer := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
local cWorkst := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters"
local cSMB := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRXSmb\Parameters"
local aKeys := {},getlist := {},cHKLM,x
local cOS := "X",oR1,oR2,lOk := .f.


if empty(cSys)
cSys := "S"
@ 1,1 dcgroup oR1 size 40,3.5 caption "Server/Workstation"
@ 1,1 dcradio cSys caption "Server" value "S" parent oR1
@ 2,1 dcradio cSys caption "Workstation" value "W" parent oR1

@ 5,1 dcgroup oR2 size 40,6 caption "Betriebssystem"
@ 1,1 dcradio cOS caption "WINDOWS 98" value "9" parent oR2
@ 2,1 dcradio cOS caption "WINDOWS NT" value "N" parent oR2
@ 3,1 dcradio cOS caption "WINDOWS 2000" value "2" parent oR2
@ 4,1 dcradio cOS caption "WINDOWS XP" value "X" parent oR2
@ 5,1 dcradio cOS caption "WINDOWS VISTA" value "V" parent oR2

@ 12,1 DCSAY 'MS Opportunistic Locking Problem Microsoft Knowledge Base' COLOR GRA_CLR_BLUE SAYSIZE 0 HYPERLINK {|p,c|p := 'url.dll,FileProtocolHandler ' + ;
'http://support.microsoft.com/kb/296264', c := 'Rundll32.exe', RunShell(p,c,.t.,.t.)}


dcread gui fit modal addbuttons to lOk title "Registry Korrekturen"
if !lOk
return .f.
endif
endif

//
// Server
//
AADD(aKeys,{"S","A","autodisconnect" ,"ffffffff",""})
AADD(aKeys,{"S","A","ConnectionNoSessionsTimeout","ffffffff",""})
AADD(aKeys,{"S","A","CachedOpenLimit" ,"0",""})
AADD(aKeys,{"S","A","EnableOpLockForceClose" ,"1",""})
AADD(aKeys,{"S","A","EnableOpLocks" ,"0",""})
AADD(aKeys,{"S","A","OplocksDisabled" ,"1",""})

// VISTA !!! "Server"
//
AADD(aKeys,{"S","A","SMB2" ,"0","V"})
//
//
// Server W2K SMB
//
AADD(aKeys,{"T","A","OplocksDisabled" ,"1","2"})
//

// Workstation
//
AADD(aKeys,{"W","A","CachedOpenLimit" ,"0",""})
AADD(aKeys,{"W","A","EnableOpLockForceClose" ,"1",""})
AADD(aKeys,{"W","A","EnableOpLocks" ,"0",""})
AADD(aKeys,{"W","A","OplocksDisabled" ,"1",""})
AADD(aKeys,{"W","A","UseLockReadUnlock" ,"0",""})
AADD(aKeys,{"W","A","UseUnlockBehind" ,"1",""})
AADD(aKeys,{"W","A","UseOportunisticLocking" ,"0",""})
AADD(aKeys,{"W","A","UtilizeNtCaching" ,"0",""})

FOR x = 1 TO len(aKeys)
if cSys = aKeys[x,1]
cHKLM := IF(aKeys[x,1]="S",cServer,IF(aKeys[x,1]="W",cWorkst,cSMB))
DC_RegWrite(,"SYSTEM",aKeys[x,3],aKeys[x,4])
endif
NEXT X
PIEP()
RETURN .t.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: und das ganze für eXPress++ umgesetzt

Beitrag von AUGE_OHR »

hi,
Rudolf hat geschrieben: cServer := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
local cWorkst := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters"
local cSMB := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRXSmb\Parameters"
das ganze arbeitet doch immer noch mit der RegClass von Thomas Braun?

Es ist bei der RegClass unbedingt auf die "gross/klein" Schreibung zu
achten da IHMO die Registry Keys CASE intensive sind. Also bitte :

Code: Alles auswählen

STATIC cServer := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters" 
STATIC cWorkst := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters" 
STATIC cSMB    := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRxSmb\Parameters" 
verwenden.

danke für deine eXPress++ umsetzung.

gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo Jimmy,
danke für die Korrektur im Beispiel, die RegClass von Thomas Braun ist nicht notwendig, eXPress++ hat seine eigene. Und wieder mal ein nettes Beispiel mit wie wenig Code im Vergleich zur anderen Version man in eXPress++ zu einem Ergebnis kommt ;-)
Grüsse
Rudolf
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Notwendigkeit von Opportunistic locking ?

Beitrag von Bernd Reinhardt »

Hallo.

Wir arbeiten bei uns und bei unseren Kunden ohne Änderungen an der Registry. Hat bisher ganz brauchbar funktioniert.
Datenbank dbf/ntx mit max. 15 MB Datenbankgröße.
Desshalb ein paar kurze Fragen dazu:
1. Welche Geschwindigkeitssteigung ist zu erwarten?
2. Was passiert wenn nicht auf allen Rechnern die Registry geändert wurde. Hauptsächlich bei neuem Clienten (PC getauscht)
3. Hat die Änderung der Registry noch andere Auswirkungen auf z. B. office?
4. Bringt es in irgendeiner Weise auch einen Vorteil bei Einzelplatz.
Hier werden die Dateien ja auch alle shared geöffnet.

Welches ist (besonders im Netzwerk) ist schnellste Kombination.
dbf/ntx oder dbf/cdx oder gibt es noch was schnelleres als Datenbank ohne Server. (ADS, SQL)

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Bernd,

Fragen 1 und 2: OP-Locks hat nur etwas damit zu tun, das Dateien im Netzwerk mehrfach sauber geöffnet werden können. Wenn man das einschalten muß (weil es sonst zu Datenverlusten kommt), dann gibt es keine GeschwindigkeitsSTEIGERUNG sondern einen EINBRUCH.

Frage 3: Nein. Wieso auch.

Farge 4: Nein. Denn es geht ja um den konkurrierenden Zugriff im Netzwerk.

Jan
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Locking

Beitrag von Bernd Reinhardt »

Hallo Jan.

Nur mal so zu meinem Verständniss.
Wir erstellen seit 15 Jahren Software für Multiuser-Multitasking.
Cl*pper, xBase++ unter PC-MOS (Multiuser DOS), und WIN XX.
Wir haben bisher noch keine Änderungen an der Registry oder
ähnlichen Einstellungen vorgenommen.
Die Programme haben soweit gut funktioniert.
Normal sind 2 bis 5 USER gleichzeitig am arbeiten.

Desshalb verstehe ich nicht ganz aus welchem Grund die Änderungen
in der Registry notwendig sind und welchen konkreten Vorteil
wir davon haben.
Oder anderst gefragt wie erkenne ich das ich Änderungen in der
Registry machen muss.
Oder ist es sinnvoll diese Änderungen einfach zu machen.

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

ich habe bisher auch noch nie Registry Werte geändert.
Bevor wir Citrix eingesetzt haben waren 2 Anwendungen mit mindestens 5 Usern am Laufen. Welchen NT Server wir hatten weiß ich aber nicht mehr.

Seit Citrix sind diese 3 Win2000 SERVER mit mehreren gleichzeitigen Anwendungen auf dem Dateiserver. Vor kurzem wurde auf Win2003 Server umgestellt. Bis jetzt gings gut.

Grundsätzlich betrifft es nur Windowsserver.
OS/2, Netware, Linux etc. haben solche Einstellungen gar nicht.
In einem Peer to Peer Netzwerk ist natürlich jede Arbeitsstation auch ein Server.

Ich vermute dass erst ab deutlich mehr User Probleme auftreten.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

Du hast zwar recht, daß Linuxsysteme soetwas garnicht haben. Aber die Ops-Locks muß man dennoch einstellen. Wir hatten auf unserem Server massivste Probleme damit, bis wir die auf den Datenbankzugriff eingestellt haben. Seit ein paar Jahren geht das auch für jedes gemountete Laufwerk extra, man reduziert damit also nicht die Performance des gesamten Servers, sondern nur den Bereich, wo die Datenbanken liegen (wenn man den Server entsprechend eingerichtet hat).

Jan
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Moin,

wobei anzumerken ist, das bei Linuxsystemen, die Samba haben die Oplocks eingeschaltet werden. Oder aber der Parameter wird gar nicht angegeben, dann ist er wohl aktiviert. Testversuche haben ergeben, bei abgeschalteten Oplocks verlangsamt sich die Geschwindigkeit um den Faktor 3. Dieses Thema hatten wir hier im Forum schon einmal vor einigen Monaten.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Locking

Beitrag von AUGE_OHR »

hi,
Bernd Reinhardt hat geschrieben: Wir erstellen seit 15 Jahren Software für Multiuser-Multitasking.
Cl*pper ...
mit Cl*pper und Novell Server gab es doch mal "ähnliche" Probleme
als die TurboFAT eingeführt haben ...
Bernd Reinhardt hat geschrieben: Wir haben bisher noch keine Änderungen an der Registry oder
ähnlichen Einstellungen vorgenommen.
Die Programme haben soweit gut funktioniert.
Normal sind 2 bis 5 USER gleichzeitig am arbeiten.
schau doch mal unter :
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters"
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters"
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRxSmb\Parameters"
ob du da schon Einträge hast ! Es gibt auch andere Applicationen die da
an der Registry drehen.
Bernd Reinhardt hat geschrieben: Desshalb verstehe ich nicht ganz aus welchem Grund die Änderungen
in der Registry notwendig sind und welchen konkreten Vorteil
wir davon haben.
es geht um alles was mit "locking" zu tun hat. Dazu gehören auch die
Navigation wie SKIP, GOTO etc. weil da auch der Index "geloggt" wird.

wenn du also den üblichen 8999 Gencode Error bekommst dann hat das
meistens was mit Op´s lock zu tun.

Meiner Erfahrung nach tritt das Problem auch eher bei Xbase++ GUI
Anwendungen als bei Cl*pper/Hybrid Anwendungen auf da man dort
den ständigen :datalink statt eine explizieten "Store/Replace" hat.
Deshalb verwende ich da wieder Memvars (Array) und als :datalick

Code: Alles auswählen

oSLE:dataLink     := VAR1BLOCK(@cBegriff)
...
FUNCTION VAR1BLOCK(uMem)                                    // for SLEPIC
LOCAL bblock
RETURN {| x | IIF(x == NIL,uMem,uMem := x)}

FUNCTION VAR2BLOCK(uMem)                                    // for DBF Fields
LOCAL bblock
   DO CASE
      CASE VALTYPE(uMem) = "D"
         bblock := {| x | IIF(x == NIL,DTOC(uMem),uMem := CTOD(x))}
      CASE VALTYPE(uMem) = "C"
         bblock := {| x | IIF(x == NIL,uMem,uMem := x)}
      CASE VALTYPE(uMem) = "N"
         bblock := {| x | IIF(x == NIL,TRANSFORM(uMem,'@N'),uMem := VAL(x))}
      OTHERWISE
         bblock := {| x | IIF(x == NIL,uMem,uMem := x)}
   ENDCASE
RETURN bblock
somit greift der :datalink nicht ständig auf die DBF zu und ich kann
explizit nur geänderte Felder zurückschreiben statt mit GATHER() alle.
Bernd Reinhardt hat geschrieben: Oder anderst gefragt wie erkenne ich das ich Änderungen in der
Registry machen muss.
compile/link/run einen von den oben angegebenen Source :)
Bernd Reinhardt hat geschrieben: Oder ist es sinnvoll diese Änderungen einfach zu machen.
never touch a running System :)

im Ernst, es kommt ja immer auf deine Umgebung an. Wenn es läuft
würde ich nichts ändern, aber sobald Probleme auftreten und man keine
Änderrungen an seiner Xbase++ Application vorgenommen hat so sollte
man bei den 8999 Fehlern mal seine Op´s lock Einstellungen kontrollieren.

Bei einem Standalone PC disable ich auch den Dienst "Server" da der
da nur Ballast ist. dito ist jeder unnötige Eintrag in der Registry ein Ballast.

gruss by OHR
Jimmy
Benutzeravatar
michael32710
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Sa, 17. Nov 2007 11:02
Wohnort: Niedersachsen
Kontaktdaten:

Re: Op´s lock

Beitrag von michael32710 »

Zum Code von AUGE_OHR vom 14. Juli 2007 (s. 1. Posting dieses Threads) kann man nach dem Piersig-Vortrag vom 20. 11. 2010 ab ungefähr Zeile 146 folgendes ergänzen:

Code: Alles auswählen

 AADD(aKeys,{"W","A","FileInfoCacheLifetime"      ,"0"})   // if not present,defaults to 10 seconds
 AADD(aKeys,{"W","A","FileNotFoundCacheLifetime"  ,"0"})   // if not present,defaults to 5 seconds
 AADD(aKeys,{"W","A","DirectoryCacheLifetime"     ,"0"})   // if not present,defaults to 10 seconds
LG
Michael
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Op´s lock

Beitrag von Jan »

Hallo Michael,

nach dem Votrag hat Steffen mich auf einen Fallstrick hingewiesen: Man muß diese Einträge unter Admin-Rechten einrichten! Sonst nützt das nicht viel, weil Vista und 7 da Schutzmechanismen eingebaut hat. Deswegen bringt Alaska ja ein eigenes MSI-Paket raus, über daß das dann laufen kann.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
michael32710
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Sa, 17. Nov 2007 11:02
Wohnort: Niedersachsen
Kontaktdaten:

Re: Op´s lock

Beitrag von michael32710 »

Hallo Jan,
Jan hat geschrieben:... Man muß diese Einträge unter Admin-Rechten einrichten! Sonst nützt das nicht viel, weil Vista und 7 da Schutzmechanismen eingebaut hat. Deswegen bringt Alaska ja ein eigenes MSI-Paket raus, über daß das dann laufen kann.
Danke für Deine Ergänzung. Es ist doch immer gut, wenn man mal "drüber gesprochen" hat.
LG
Michael
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Op´s lock

Beitrag von AUGE_OHR »

Jan hat geschrieben:Man muß diese Einträge unter Admin-Rechten einrichten! Sonst nützt das nicht viel, weil Vista und 7 da Schutzmechanismen eingebaut hat. Deswegen bringt Alaska ja ein eigenes MSI-Paket raus, über daß das dann laufen kann.
meinst du mit MSI = Manifest ?
so sieht das "neue" Manifest für die (noch nicht veröffentliche) neue Version aus

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="*"
     name="SMB fix"
     type="win32"/>
  <description>Set SMB </description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
<dependency>
    <dependentAssembly>
         <assemblyIdentity
             type="win32"
             name="Microsoft.Windows.Common-Controls"
             version="6.0.0.0"
             processorArchitecture="X86"
             publicKeyToken="6595b64144ccf1df"
             language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Op´s lock

Beitrag von AUGE_OHR »

moin,

der bisher veröffentlichte Code gilt für W2K, Xp und W2K3 wenn man 8999 Error etc hat.
wenn diese Fehler im Netzwerk mit einem "Server" passieren könnte ein Ops Locking Problem vorliegen.

!!! da auch "falsche" Einträge in der DBESYS.PRG möglich sind, bitte wenn mögllich mit Cl*pper etc. zu "verifizieren" !!!

W2K, Xp und W2K3 kennt nur SMB1, über NetBios Port 139.(ohne Hotfix s.u.)

In einem "pure" Win7 / Srv2008 Environment sollte SMB2, Port 445, arbeiten.
mit SMB2 ist Ops Locking nun "endlich" unter "pure" Win7 "das" was es sein "sollte" und sogar Cl*pper macht keine Probleme.
( Redirector : MRXSMB20.SYS v6.1.7600.16562 / SP1 beta / SP1 RC 6.1.7601.17105 )

Die SMB1 Ops Locking Einstellungen sind nicht für Win7 / Srv 2008 gedacht und würden Win7 dazu "zwingen" über Port 139 zu "kommunizieren".

der "Vorteil" des "Mix-Betrieb" wäre, gegenüber SMB2 "komplett" abzuschalten, das "nur" die gesetzten Ops Locking Parameter "aktive" sind.
eine "Kommunikation" auf Port 445 ist weiterhin möglich.

"besser" aber für XP SP2/SP3 einen neuen "Responder" KB922120 installieren.
http://www.xbaseforum.de/viewtopic.php? ... der#p49263
der Hotfix beinhaltet "Network Topology Responder Protocol Driver for NDIS 6" mit den Dateien Rspndr.exe und Rspndr.sys.
damit "antwortet" XP SP2/SP3 dann auf Port 445 wenn er in einem SMB2 Environment "gefragt" wird

btw. man "könnte" dann auch manuell "NetBios over TCP" disable(n) und im Firewall alle UDP Ports in einem SMB2 Netzwerk "zumachen"...



nun zurück zum "lates" Version der Demo in der ich nun OnOsVersion() berücksichtige.

Code: Alles auswählen

STATIC FUNCTION OnOSVersion()
LOCAL cVersion := OS(OS_VERSION)
LOCAL nVersion := 0
LOCAL nPosi := AT(".",cVersion)
   IF nPosi > 0
      nVersion := VAL(SUBSTR(cVersion,1,nPosi-1))
   ENDIF
RETURN nVersion
dies ist für Win7 wichtig, den einige Registry Setting habe eine "gegenteilige" Wirkung je nach OS() Version.
ich habe deshalb die URL zu den Quellen "eingearbeitet" und die URL kann direkt aufgerufen werden.

nun gibt es ja nicht nur Ops Lock Settings sondern diverse Registry Setting die angewandt sein könnten und nicht für Win7 gedacht sind.
ich habe auch noch einige "eigene" Registry Einträge mit aufgenommen um die mit Win7 zu testen.
OpsLock2_Legend.JPG
OpsLock2_Legend.JPG (112.78 KiB) 15281 mal betrachtet
ich muss aber die Tests noch abschliessen bevor ich es uploade.
gruss by OHR
Jimmy
Benutzeravatar
Mirco
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 143
Registriert: Di, 03. Feb 2009 15:47
Wohnort: Viersen
Kontaktdaten:

Re: Op´s lock

Beitrag von Mirco »

Hallo Jimmy,

gibt es zu dem Tool etwas neues? Versuche mich seit Stunden durch den "Wust" an Infos zu lesen, was alles Performanceprobleme in unserem XBase++ Programm (allerdings mit noch viel "altem" Clipper Code zwischendrin) verursachen kann. Ich bin am überlegen, dafür mal einen Extra Thread aufzumachen....
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Op´s lock

Beitrag von AUGE_OHR »

Mirco hat geschrieben:gibt es zu dem Tool etwas neues?
ich habe keine weiter Version veröffentlicht weil die Tips ja für SMB(1) sind also bis XP.
Mirco hat geschrieben:Versuche mich seit Stunden durch den "Wust" an Infos zu lesen, was alles Performanceprobleme in unserem XBase++ Programm (allerdings mit noch viel "altem" Clipper Code zwischendrin) verursachen kann. Ich bin am überlegen, dafür mal einen Extra Thread aufzumachen....
ich gehe mal von Netzwerk Problemen und Win7 aus.
im Prinzip läuft ein Cl*pper Programm in einem Win7 / 32bit Netzwerk "ohne Probleme" was dann auch für Xbase++ gelten sollte.

zu Win7 / SMB(2) : verwende UNC Path statt MAP Drive

XP mit WIN7 / Srv 2K8 ... kannst du die XP Workstation vom Server aus "sehen" ? wenn nein such mal nach KB922120
gruss by OHR
Jimmy
Antworten