WinAPI Library (Snippets) (1163 Beispielcodes)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Falko »

Hallo Ray,

prima Arbeit. :allright:

Kleine Anmerkung habe ich noch. Nachdem ich unter Windows10 in PB den alten
Codebaustein entfernt hatte um die neue hinzuzufügen, wurde das nicht eingefügt.
Purebasic ist dabei aktiv gewesen. Erst nach beenden von Purebasic und Codebausteine
hinzufügen, wurde deine WinAPI-Library übernommen. Vielleicht noch eine Funktion hinzufügen,
die das PB vorher beendet und nach dem Hinzufügen wieder startet. Der Path ist ja bekannt.

Wie gesagt, ich kann das jetzt nur noch unter Windows 10 ausprobieren, da ich alle Rechner darauf umgestellt hatte.

Gruß,
Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von RSBasic »

Hi Falko,

die Abfrage, ob PB noch läuft, habe ich auf jeden Fall schon mal gebaut. Wahrscheinlich nur beim Updater. Ich werde diese Abfrage beim Einfügen der Codebausteine ebenfalls hinzufügen, damit der von dir gefundene Fehler nicht mehr auftritt. Danke fürs Melden :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von RSBasic »

WinAPI Library 1.4.1 wurde veröffentlicht (3 neue Sprachen)

Hallo ihr lieben,

es gibt einige Nutzer, die wollen gerne eine Multilanguage-Version haben. Außerdem fand ich vor einigen Monaten heraus, dass meine WinAPI Library im französischen Forum bekannt geworden ist und dass es Leute gibt, die die Codes aus meiner WinAPI Libraray mit Google übersetzt haben, damit diese Codes in dieser Sprache ebenfalls verfügbar sind.
Das finde ich echt toll, aber es ist für die fleißigen User zu aufwändig, die Codes nach jedem Update meiner Anwendung übersetzen zu müssen.
Damit sie das nicht jedes Mal machen müssen, habe ich jetzt selber eine Automatisierungsanwendung zum Übersetzen geschrieben und werde sie bei jedem Update ausführen.
Nicht nur französisch wird unterstützt, sondern auch andere Sprachen.

Meine WinAPI Library (inkl. Codes) gibt es ab jetzt in folgenden Sprachen:
  • Deutsch (das ist klar^^)
  • Englisch
  • Spanisch
  • Französisch
Die Sprache könnt ihr am Anfang beim ersten Start dieser Version oder später im Menü unter "Sprache" ändern.
Alle Texte (Kommentare und Strings in den PB-Dateien wurden nicht berücksichtigt) in englischer, französischer und spanischer Sprache wurden mit "Google Translate" maschinell übersetzt und es kann möglich sein, dass einige Texte grammatikalisch nicht korrekt sind, aber ich hoffe, man kann die einzelnen Code-Bezeichnungen trotzdem verstehen.
Wenn ihr zusätzlich eine weitere Sprache haben wollt, sagt Bescheid und ich füg sie hinzu.

Jetzt kann ich meine WinAPI Library auch im englischen und französischen Forum verbreiten und zukünftige Updates ankündigen.

Online: http://www.rsbasic.de/winapi-library
Offline: http://www.rsbasic.de/downloads/winapi_library.zip (aktuelle Version mit allen Codes)

PS: Ein Offline-Update von einer älteren Version auf diese neue Version ist leider nicht möglich. Bitte ladet die vollständige ZIP-Datei herunter.

@Falko
Erledigt
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Bisonte »

Alle Achtung... :allright:

Ist dann ja nicht mehr weit bis zur Weltherrschaft :mrgreen:
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Vera »

Hi Ray,
auch an dieser Stelle nochmal ein "w0w das ist toll" und vielen Dank für dieses hilfreiche Tool Bild

Lieber Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Falko »

@Ray,
danke, und super Arbeit. :allright: :allright: :allright:
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von RSBasic »

Ist das eigentlich so schlimm, wenn das eine Integer-Variable ist?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Sicro »

Code: Alles auswählen

Define.l a = 129
Define.q b

CopyMemory(@a, @b, SizeOf(Long))

;ShowMemoryViewer(@b, SizeOf(Quad)) 000000000064788C
b = 129
;ShowMemoryViewer(@b, SizeOf(Quad)) 000000000064788C
Ok, hast recht, macht kein Unterschied.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: WinAPI Library (Snippets) (1.052)

Beitrag von Sicro »

Code: Alles auswählen

EnableExplicit

DeclareModule FileInfo
  EnableExplicit
  
  Declare.s GetFixedProductVersion(File.s)
  Declare.s GetFixedFileVersion(File.s)
  Declare.s GetFixedFileType(File.s)
  Declare.s GetProductVersion(File.s)
  Declare.s GetFileVersion(File.s)
  Declare.s GetProductName(File.s)
  Declare.s GetFileDescription(File.s)
  Declare.s GetFileComments(File.s)
  Declare.s GetFileCompanyName(File.s)
  Declare.s GetFileInternalName(File.s)
  Declare.s GetFileLegalCopyright(File.s)
  Declare.s GetFileLegalTrademarks(File.s)
  Declare.s GetFileOriginalFilename(File.s)
EndDeclareModule

Module FileInfo
  Procedure.s GetFixedProductVersion(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected.s 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.s GetFixedFileVersion(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected.s 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.s GetFixedFileType(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer.VS_FIXEDFILEINFO
    Protected.s 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.s GetProductVersion(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileVersion(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetProductName(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileDescription(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileComments(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileCompanyName(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileInternalName(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileLegalCopyright(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileLegalTrademarks(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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.s GetFileOriginalFilename(File.s)
    Protected.i NeededBufferSize, PointerLen
    Protected   *Buffer, *Pointer
    Protected.s 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

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)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten