im VX Debugger funktioniert es ... [erledigt]

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

im VX Debugger funktioniert es ... [erledigt]

Beitrag 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
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: im VX Debugger funktioniert es ... [erledigt]

Beitrag 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 :?:
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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 ;-)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

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

Beitrag 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
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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() )
Gruß
Hubert
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: im VX Debugger funktioniert es ... [erledigt]

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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.
Gruß
Hubert
Antworten