Aktuelle Zeit: 26.05.2018 14:05

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Modul "FileInfo"
BeitragVerfasst: 21.01.2017 15:23 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Ich habe gerade gemerkt, dass ich das Modul "FileInfo" nur im Thread "WinAPI Library (Snippets)" veröffentlicht habe.
Hier ist er aber besser aufzufinden.

Code:
;   Description: Gets informations from executable file
;     File-Date: 2018-01-30
;            OS: Windows
;       License: MIT License
; English-Forum:
;  French-Forum:
;  German-Forum: http://www.purebasic.fr/german/viewtopic.php?f=8&t=30000
; -----------------------------------------------------------------------------

; MIT License
;
; Copyright (c) 2017 Sicro
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in all
; copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
; SOFTWARE.

CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
  CompilerError "Supported OS are only: Windows"
CompilerEndIf

DeclareModule FileInfo
  EnableExplicit

  Declare$ GetFixedProductVersion(File$)
  Declare$ GetFixedFileVersion(File$)
  Declare$ GetFixedFileType(File$)
  Declare$ GetProductVersion(File$)
  Declare$ GetFileVersion(File$)
  Declare$ GetProductName(File$)
  Declare$ GetFileDescription(File$)
  Declare$ GetFileComments(File$)
  Declare$ GetFileCompanyName(File$)
  Declare$ GetFileInternalName(File$)
  Declare$ GetFileLegalCopyright(File$)
  Declare$ GetFileLegalTrademarks(File$)
  Declare$ GetFileOriginalFilename(File$)
EndDeclareModule

Module FileInfo
  Procedure$ GetFixedProductVersion(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected   RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\", @*Pointer, @PointerLen)
    If *Pointer
      RetVal$ = Str(*Pointer\dwProductVersionMS >> 16 & $FFFF) + "." +
               Str(*Pointer\dwProductVersionMS & $FFFF) + "." +
               Str(*Pointer\dwProductVersionLS >> 16 & $FFFF) + "." +
               Str(*Pointer\dwProductVersionLS & $FFFF)
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn RetVal$
  EndProcedure

  Procedure$ GetFixedFileVersion(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected   RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\", @*Pointer, @PointerLen)
    If *Pointer
      RetVal$ = Str(*Pointer\dwFileVersionMS >> 16 & $FFFF) + "." +
               Str(*Pointer\dwFileVersionMS & $FFFF) + "." +
               Str(*Pointer\dwFileVersionLS >> 16 & $FFFF) + "." +
               Str(*Pointer\dwFileVersionLS & $FFFF)
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn RetVal$
  EndProcedure

  Procedure$ GetFixedFileType(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected   RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\", @*Pointer, @PointerLen)
    If *Pointer
      Select *Pointer\dwFileType
        Case #VFT_APP
          RetVal$ = "Application"
        Case #VFT_DLL
          RetVal$ = "DLL"
        Case #VFT_DRV
          Select *Pointer\dwFileSubtype
            Case #VFT2_DRV_COMM
              RetVal$ = "Communications Driver"
            Case #VFT2_DRV_DISPLAY
              RetVal$ = "Display Driver"
            Case #VFT2_DRV_INSTALLABLE
              RetVal$ = "Installable Driver"
            Case #VFT2_DRV_KEYBOARD
              RetVal$ = "Keyboard Driver"
            Case #VFT2_DRV_LANGUAGE
              RetVal$ = "Language Driver"
            Case #VFT2_DRV_MOUSE
              RetVal$ = "Mouse Driver"
            Case #VFT2_DRV_NETWORK
              RetVal$ = "Network Driver"
            Case #VFT2_DRV_PRINTER
              RetVal$ = "Printer Driver"
            Case #VFT2_DRV_SOUND
              RetVal$ = "Sound Driver"
            Case #VFT2_DRV_SYSTEM
              RetVal$ = "System Driver"
            ;Case #VFT2_DRV_VERSIONED_PRINTER
             ; RetVal = "Versioned Printer Driver"
            Case #VFT2_UNKNOWN
              RetVal$ = "Unkown by the system"
          EndSelect
        Case #VFT_FONT
          Select *Pointer\dwFileSubtype
            Case #VFT2_FONT_RASTER
              RetVal$ = "Raster Font"
            Case #VFT2_FONT_TRUETYPE
              RetVal$ = "TrueType Font"
            Case #VFT2_FONT_VECTOR
              RetVal$ = "Vector Font"
            Case #VFT2_UNKNOWN
              RetVal$ = "Unkown by the system"
          EndSelect
        Case #VFT_STATIC_LIB
          RetVal$ = "Static-link Library"
        Case #VFT_UNKNOWN
          RetVal$ = "Unkown by the system"
        Case #VFT_VXD
          RetVal$ = "Virtual Device"
      EndSelect
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn RetVal$
  EndProcedure

  Procedure$ GetProductVersion(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\ProductVersion", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\ProductVersion", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileVersion(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\FileVersion", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\FileVersion", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetProductName(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\ProductName", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\ProductName", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileDescription(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\FileDescription", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\FileDescription", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileComments(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\Comments", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\Comments", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileCompanyName(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\CompanyName", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\CompanyName", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileInternalName(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\InternalName", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\InternalName", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileLegalCopyright(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\LegalCopyright", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\LegalCopyright", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileLegalTrademarks(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\LegalTrademarks", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\LegalTrademarks", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure

  Procedure$ GetFileOriginalFilename(File$)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected   TranslationCode$, RetVal$

    NeededBufferSize = GetFileVersionInfoSize_(@File$, 0)
    If NeededBufferSize < 1: ProcedureReturn "": EndIf

    *Buffer = AllocateMemory(NeededBufferSize)

    GetFileVersionInfo_(@File$, 0, NeededBufferSize, *Buffer)
    VerQueryValue_(*Buffer, "\\VarFileInfo\\Translation", @*Pointer, @PointerLen)
    If *Pointer
      TranslationCode$ = RSet(Hex(PeekW(*Pointer)), 4, "0") + RSet(Hex(PeekW(*Pointer + 2)), 4, "0")
      If VerQueryValue_(*Buffer, "\\StringFileInfo\\" + TranslationCode$ + "\\OriginalFilename", @*Pointer, @PointerLen)
        RetVal$ = Trim(PeekS(*Pointer))
      Else
        ; Manche Programme haben einen falschen TranslationCode, zu dem es kein Informationen-Block gibt.
        ; Ich habe die Erfahrung gemacht, dass in diesem Fall immer ein Block mit diesem TranslationCode vorhanden ist:
        If VerQueryValue_(*Buffer, "\\StringFileInfo\\040904E4\\OriginalFilename", @*Pointer, @PointerLen)
          RetVal$ = Trim(PeekS(*Pointer))
        EndIf
      EndIf
    EndIf
    FreeMemory(*Buffer)

    ProcedureReturn Trim(RetVal$)
  EndProcedure
EndModule

;-Example
CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
 
  Define File$ = "notepad.exe"
 
  Debug "FileComments:         " + FileInfo::GetFileComments(File$)
  Debug "FileCompanyName:      " + FileInfo::GetFileCompanyName(File$)
  Debug "FileDescription:      " + FileInfo::GetFileDescription(File$)
  Debug "FileInternalName:     " + FileInfo::GetFileInternalName(File$)
  Debug "FileLegalCopyright:   " + FileInfo::GetFileLegalCopyright(File$)
  Debug "FileLegalTrademarks:  " + FileInfo::GetFileLegalTrademarks(File$)
  Debug "FileOriginalFilename: " + FileInfo::GetFileOriginalFilename(File$)
  Debug "FileVersion:          " + FileInfo::GetFileVersion(File$)
  Debug "FixedFileType:        " + FileInfo::GetFixedFileType(File$)
  Debug "FixedFileVersion:     " + FileInfo::GetFixedFileVersion(File$)
  Debug "FixedProductVersion:  " + FileInfo::GetFixedProductVersion(File$)
  Debug "ProductName:          " + FileInfo::GetProductName(File$)
  Debug "ProductVersion:       " + FileInfo::GetProductVersion(File$)
CompilerEndIf


Der obige Code wird nicht mehr aktualisiert. Bitte schaue für den aktuellsten Code ins CodeArchiv:
https://github.com/SicroAtGIT/PureBasic ... iv-Rebirth
Pfad: File/FileInfo.pbi

Wegen Umbauarbeiten am CodeArchiv ist der Code im Archiv noch nicht aktualisiert worden, daher ist derzeit der obige Code aktuell und nicht der im CodeArchiv.

Edit:
- MIT-Lizenz hinzugefügt
- Ein paar Anpassungen am Code-Header

_________________
Bild

PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!

Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Zuletzt geändert von Sicro am 30.01.2018 22:49, insgesamt 5-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 21.01.2017 16:56 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
:allright: Danke fürs Teilen!

Ich hab da aber noch einen kleinen Verbesserungsvorschlag :wink:

Am Anfang des Codes, das EnableExplicit weglassen und das Beispiel so einfügen:
Code:
CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
  Define File.s = "notepad.exe"
 
  Debug "FileComments:         " + FileInfo::GetFileComments(File)
  Debug "FileCompanyName:      " + FileInfo::GetFileCompanyName(File)
  Debug "FileDescription:      " + FileInfo::GetFileDescription(File)
  Debug "FileInternalName:     " + FileInfo::GetFileInternalName(File)
  Debug "FileLegalCopyright:   " + FileInfo::GetFileLegalCopyright(File)
  Debug "FileLegalTrademarks:  " + FileInfo::GetFileLegalTrademarks(File)
  Debug "FileOriginalFilename: " + FileInfo::GetFileOriginalFilename(File)
  Debug "FileVersion:          " + FileInfo::GetFileVersion(File)
  Debug "FixedFileType:        " + FileInfo::GetFixedFileType(File)
  Debug "FixedFileVersion:     " + FileInfo::GetFixedFileVersion(File)
  Debug "FixedProductVersion:  " + FileInfo::GetFixedProductVersion(File)
  Debug "ProductName:          " + FileInfo::GetProductName(File)
  Debug "ProductVersion:       " + FileInfo::GetProductVersion(File)
CompilerEndIf


So kann man das als Include-Datei nutzen ohne Änderungen durchzuführen!

Gruß
Thomas

_________________
PureBasic 5.62 | SpiderBasic 2.10 | Windows 10 Pro (x64) | Linux Mint 18.3 (x64)
"Ich möchte gerne die Welt verändern, doch Gott gibt den Quellcode nicht frei."
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 22.01.2017 18:24 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Code angepasst und ihn zum CodeArchiv hinzugefügt. Danke! :)

_________________
Bild

PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!

Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 26.01.2018 11:46 
Offline

Registriert: 07.02.2017 11:39
This one doesn't work correctly with Windows 10 apps (Windows Explorer shows file details correctly, but PB functions return empty strings).

Eg. C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1712.3351.0_x64__8wekyb3d8bbwe\Calculator.exe

Any solution?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 26.01.2018 15:17 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Hello Rinzwind, thank you for pointing out that the code doesn't work on Windows 10 apps. This weekend I'll see why it doesn't work.

Please note: The code will shortly be available under the MIT license. Therefore, please wait a short time if you want to use the code.

_________________
Bild

PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!

Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Zuletzt geändert von Sicro am 26.01.2018 15:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 26.01.2018 15:32 
Offline

Registriert: 07.02.2017 11:39
Found out that setting tempcli to 040904B0 works in this case (English).

Also tried GetFileVersionInfoSizeEx & GetFileVersionInfoEx with #FILE_VER_GET_NEUTRAL | #FILE_VER_GET_LOCALISED but that still caused no result from VerQueryValue.

But it seems like a problem specific to only a few apps like Calculator (which happened to be the one I choose to test :)). Another app like the Calendar C:\Program Files\WindowsApps\microsoft.windowscommunicationsapps_17.8827.21595.0_x64__8wekyb3d8bbwe\HxCalendarAppImm.exe does return info...

Also read somewhere (.net framework source github) that Explorer itself also tries some fallbacks when it doesn't get a result at first..
"040904B0" ; US English + CP_UNICODE
"040904E4" ; US English + CP_USASCII
"04090000" ; US English + unknown codepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 28.01.2018 18:15 
Offline

Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding
OT:

Und wenn Du dazu noch eine GetIcon() oder GetIconImage(OptionalSizeParameter) hinzufügen kannst, wäre das ja mal ziemlich "Zucker-leckerli". Oder passt das nicht wirklich thematisch zum Modul dazu?

Da hätte man alles in einem Modul bzw. aus einer Hand für seine "Datei-Eigenschaften" Procedure / Dialog-Box oder sowas.

Nur so eine Idee...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul "FileInfo"
BeitragVerfasst: 30.01.2018 21:07 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
@Rinzwind:
Thank you very much for this informations. As soon as I have enough time, I will include the further workarounds in the code and will probably improve the code a little bit.

@Benubi:
Vielen Dank für deinen Vorschlag. :allright:
Das werde ich einbauen. :wink:

_________________
Bild

PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!

Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye