Seite 1 von 1

im VX Debugger funktioniert es ... [erledigt]

Verfasst: Do, 14. Jun 2012 1:16
von AUGE_OHR
hi,

ich will nur wissen ob die "OT4XB.DLL" im Zugriff ist.

unter XP funktioniert es ohne Probleme aber unter Win7 (32/64) und Win8
geht es mit dem EXE nicht ... aber mit VX als Debugger geht es !!!

natürlich geht es auch wenn ich die DLL in das Applications Verzeichnis lege ...

aber warum geht es mit dem Debugger (.T.) und ohne gibt es mir .F. ?

XPP TEST.PRG -B
ALINK /DE TEST.OBJ

TEST.EXE -> "yes" nur bei XP, "no" unter Win7/8
VX20.EXE TEST.EXE -> "yes" auch unter Win7/8

Code: Alles auswählen

PROCEDURE MAIN
   IF is_ot4xb()
      Msgbox("yes")
   ELSE
      Msgbox("no")
   ENDIF
RETURN

FUNCTION is_ot4xb()
LOCAL lRet := .F.
LOCAL aInfo
LOCAL cHome     := LEFT(AppName(.T.),LEN(AppName(.T.))-LEN(AppName(.F.)))
LOCAL cXppPath  := GETENV("XPPROOT")            // XPP ROOT path
LOCAL cLIBpath  := GETENV("LIB")
LOCAL cSysPath  := GETENV("PATH")
LOCAL DllName   := "OT4XB.DLL"
LOCAL cPath     := ""

   DO CASE
      CASE FILE(cHome+DllName)                           ; lRet := .T.
      CASE IsFileInPath(cLIBpath,DllName,@cPath)         ; lRet := .T.
      CASE IsFileInPath(cSysPath,DllName,@cPath)         ; lRet := .T.
   ENDCASE

RETURN lRet

STATIC FUNCTION IsFileInPath(cEnvioment,DllName,cPath)
LOCAL RetVar := .F.
LOCAL nZahl  := 0
LOCAL nPosi  := 0
LOCAL nStart := 1
ALTD()
   DO WHILE .T.
      nPosi := AT(";",cEnvioment,nStart)
      IF nPosi > 0
         cPath := SUBSTR(cEnvioment,nStart,nPosi-nStart)
         EndwithSlash( @cPath )

         IF FILE ( cPath+DllName )
            RetVar := .T.
            EXIT
         ELSEIF FILE ( ConvToAnsiCP(cPath+DllName) )
            RetVar := .T.
            EXIT
         ELSE
            nStart := nPosi+1
         ENDIF
      ELSE
         cPath := SUBSTR(cEnvioment,nStart,LEN(cEnvioment)-nStart)
         EndwithSlash( @cPath )

         IF FILE ( cPath+DllName )
            RetVar := .T.
         ELSEIF FILE ( ConvToAnsiCP(cPath+DllName) )
            RetVar := .T.
         ENDIF
         EXIT
      ENDIF
   ENDDO

RETURN RetVar

PROCEDURE EndwithSlash(cString)
LOCAL nPosi

   nPosi := RAT("\",cString)
   IF nPosi = LEN(cString)
   ELSE
      cString += "\"
   ENDIF
   cString := StrTran( cString , "\\", "\")

RETURN

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Fr, 15. Jun 2012 7:10
von AUGE_OHR
hi,

wie so oft lag es natürlich am Programmierer ;)

Code: Alles auswählen

      ELSE
         cPath := SUBSTR(cEnvioment,nStart,LEN(cEnvioment)-nStart)
ist nicht immer richtig ...

Code: Alles auswählen

      ELSE
         cPath := SUBSTR(cEnvioment,nStart)
so sollte es sein und dann geht es auch "normal" unter jedem OS()

das es vorher mit dem Debugger dann (trotzdem) funktionierte ... :-k keine Ahnung warum :?:

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Fr, 15. Jun 2012 8:06
von brandelh
Falls du die ot4xb einsetzt, dort gibt es einige Funktionen zum Pfad trennen, "\" wegnehmen oder anfügen falls nötig etc.

Ich bin auch gerade beim ausmisten ;-)

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Fr, 15. Jun 2012 8:17
von UliTs
AUGE_OHR hat geschrieben:hi,

wie so oft lag es natürlich am Programmierer ;)

Code: Alles auswählen

      ELSE
         cPath := SUBSTR(cEnvioment,nStart,LEN(cEnvioment)-nStart)
ist nicht immer richtig ...

Code: Alles auswählen

      ELSE
         cPath := SUBSTR(cEnvioment,nStart)
so sollte es sein und dann geht es auch "normal" unter jedem OS()

das es vorher mit dem Debugger dann (trotzdem) funktionierte ... :-k keine Ahnung warum :?:
Fall 1) ist immer anders als Fall 2) :-) :!:

Code: Alles auswählen

      ELSE
         cPath := SUBSTR(cEnvioment,nStart,LEN(cEnvioment)+1-nStart)
wäre identisch :wink:
Uli

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Fr, 15. Jun 2012 8:53
von brandelh
AUGE_OHR hat geschrieben:ich will nur wissen ob die "OT4XB.DLL" im Zugriff ist.
durch diese Funktionen testest du aber nur, ob die DLL in einem der Verzeichnisse liegt - falls die Funktionen funktionieren ;-)
Ob sie tatsächlich geladen wurde, das bekommst du so nicht raus !

Hierzu könnte dies dienen (ich habe es nicht ausprobiert ;-) ) ...

Code: Alles auswählen

IsFunction( ot4xb() )

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Sa, 16. Jun 2012 1:36
von AUGE_OHR
brandelh hat geschrieben:
AUGE_OHR hat geschrieben:ich will nur wissen ob die "OT4XB.DLL" im Zugriff ist.
durch diese Funktionen testest du aber nur, ob die DLL in einem der Verzeichnisse liegt
YUP
brandelh hat geschrieben:falls die Funktionen funktionieren ;-)
jetzt JA ... ich habe nicht im ELSE Teil gesucht :banghead:
brandelh hat geschrieben:Ob sie tatsächlich geladen wurde, das bekommst du so nicht raus !
bei einem DllLoad() wird ja nur
Win32 - Unter Windows erfolgt die Suche in der Reihenfolge aktuelles Verzeichnis, Windows System Verzeichnis, Windows Verzeichnis und am Schluß alle Verzeichnisse, die in der Umgebungsvariable PATH definiert sind.
durchsucht, also nicht die Environment wie SET LIB wo ich die "OT4XB.DLL" erwarten würde.

ich möchte keine (unötige) "OT4XB.DLL" mehr mit ausliefern. Die Application soll einfach einen Hinweis ausgeben und die Menupunkte "disable".
sollte eine "ältere" Version als "gefordert" NICHT geladen werden kann das festgelegt werden.

Code: Alles auswählen

#define OT4XB_MIN_VER "001.006.000.018"
brandelh hat geschrieben:Hierzu könnte dies dienen (ich habe es nicht ausprobiert ;-) ) ...

Code: Alles auswählen

IsFunction( ot4xb() )
interessante Idee :idea: ... mal ausprobieren

Re: im VX Debugger funktioniert es ... [erledigt]

Verfasst: Sa, 16. Jun 2012 13:36
von brandelh
AUGE_OHR hat geschrieben:also nicht die Environment wie SET LIB wo ich die "OT4XB.DLL" erwarten würde.
das gilt aber nur für den Xbase++ compiler bzw. linker, während der Ausführung deines Programmes wird nur in den genannten Verzeichnissen gesucht.