AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Info-Fenster von Windows anzeigen

Ein Thema von Willie1 · begonnen am 16. Aug 2015 · letzter Beitrag vom 16. Dez 2016
Antwort Antwort
hathor
(Gast)

n/a Beiträge
 
#1

AW: Info-Fenster von Windows anzeigen

  Alt 17. Aug 2015, 20:46
Zitat:
Hallo Hathor, dass klappt auch, danke.
Und auch nur das dein Lösungsansatz.
U.U. stimmen die Parametertypen aber nicht, je nach Delphi-Version.
ShellExecuteA -> PAnsiChar
ShellExecuteW -> PWideChar
ShellExecute -> PChar
Gelaber!
Angehängte Grafiken
Dateityp: jpg SHELLEXECUTE.jpg (79,1 KB, 45x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Info-Fenster von Windows anzeigen

  Alt 17. Aug 2015, 21:08
Bei UNICODE Delphis sollte die Verweise so stehen
Delphi-Quellcode:
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeW'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA';
function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';
und bei ANSI Delphis so
Delphi-Quellcode:
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA';
function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';
und schon ist die Welt wieder hübsch in Ordnung.

Nur wenn man explizit die ANSI oder UNICODE Variante haben möchte, dann muss man die auch aufrufen mit den richtigen Typen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Info-Fenster von Windows anzeigen

  Alt 17. Aug 2015, 21:15
Es ist im Allgemeinen schon ratsam die Rückgabewerte der API Funktionen nicht nur zu prüfen, sondern auch die Exeptions werfen zu lassen.
Delphi-Quellcode:
function GetFileVersion( const AFileName: string ): TVersion; // <- selber definiert
var
  VersionInfoSize : DWORD;
  VersionInfo : Pointer;
  VersionValueSize: DWORD;
  VersionValueData: PVSFixedFileInfo;
begin
  VersionInfoSize := CheckApiNotZero(
    netAlike.Winapi.Windows.GetFileVersionInfoSize( PChar( AFileName ), nil ), // <- selber richtig deklariert
    'GetFileVersionInfoSize( %s )', [ AFileName ] );
  GetMem( VersionInfo, VersionInfoSize );
  try
    CheckApiResult(
      GetFileVersionInfo( PChar( AFileName ), 0, VersionInfoSize, VersionInfo ),
      'GetFileVersionInfo( %s )', [ AFileName ] );
    CheckApiResult(
      VerQueryValue( VersionInfo, '\', Pointer( VersionValueData ), VersionValueSize ),
      'VerQueryValue( %s, "\" )', [ AFileName ] );
    Result := TVersion.CreateFromMSLS( VersionValueData.dwFileVersionMS, VersionValueData.dwFileVersionLS ); // <- dann wird das auch leichter
  finally
    FreeMem( VersionInfo, VersionInfoSize );
  end;
end;

procedure CheckApiResult( ApiCallResult: BOOL; const AdditionalInfo: string; const Args: array of const ); overload;
begin
  if not ApiCallResult
  then
    RaiseLastOSError( GetLastError, string.Format( sLineBreak + AdditionalInfo, Args ) );
end;

procedure CheckApiResult( ApiCallResult: BOOL; const AdditionalInfo: string );
begin
  CheckApiResult( ApiCallResult, AdditionalInfo, [ ] );
end;

function CheckApiNotZero( ApiCallResult: DWORD; const AdditionalInfo: string; const Args: array of const ): DWORD; overload;
begin
  if ApiCallResult = 0
  then
    RaiseLastOSError( GetLastError, string.Format( sLineBreak + AdditionalInfo, Args ) );
  Result := ApiCallResult;
end;

function CheckApiNotZero( ApiCallResult: DWORD; const AdditionalInfo: string ): DWORD;
begin
  Result := CheckApiNotZero( ApiCallResult, AdditionalInfo, [ ] );
end;
Wenn es jetzt knallt, bekommt man auch noch direkt mit, welcher Aufruf zickt.

Wer das mit den Zusatzinfos nicht benötigt, bekommt dadurch ein sehr kurze und übersichtliche Routine:
Delphi-Quellcode:
function GetFileVersion( const AFileName: string ): TVersion; // <- selber definiert
var
  VersionInfoSize : DWORD;
  VersionInfo : Pointer;
  VersionValueSize: DWORD;
  VersionValueData: PVSFixedFileInfo;
begin
  VersionInfoSize := CheckApiNotZero( netAlike.Winapi.Windows.GetFileVersionInfoSize( PChar( AFileName ), nil ) );
  GetMem( VersionInfo, VersionInfoSize );
  try
    CheckApiResult( GetFileVersionInfo( PChar( AFileName ), 0, VersionInfoSize, VersionInfo ) );
    CheckApiResult( VerQueryValue( VersionInfo, '\', Pointer( VersionValueData ), VersionValueSize ) );
    Result := TVersion.CreateFromMSLS( VersionValueData.dwFileVersionMS, VersionValueData.dwFileVersionLS ); // <- dann wird das auch leichter
  finally
    FreeMem( VersionInfo, VersionInfoSize );
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (17. Aug 2015 um 21:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:03
Zitat:
Hallo Hathor, dass klappt auch, danke.
Und auch nur das dein Lösungsansatz.
U.U. stimmen die Parametertypen aber nicht, je nach Delphi-Version.
ShellExecuteA -> PAnsiChar
ShellExecuteW -> PWideChar
ShellExecute -> PChar
Gelaber!
Dann mach dasselbe doch mal mit Delphi <= 2007.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:20
Dann mach dasselbe doch mal mit Delphi <= 2007.
Kann man bei Delphi vor der Version 2007 das hier nicht schreiben?
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA'; Wäre mir jetzt neu ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#6

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:25
Und das hat genau was mit meinem Post zu tun? ShellExecute ist in Delphi <= 2007 als ShellExecuteA deklariert und erwartet PAnsiChar-Parameter (entspricht PChar in diesen Versionen). Ab Delphi 2009 ist es ShellExecuteW mit PWideChar-Parametern (entspricht dann hier PChar). Der Compiler weiß natürlich, von welchem Ursprungstyp PChar ist und zeigt diesen dann im Hint an. Von daher hat der gepostete Screenshot keine "Beweiskraft".
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:36
Wenn man es vernünftig haben will, dann nimmt erstellt man sich eine Unit, wo man a) die Api-Aufrufe korrekt deklariert und b) UNICODE / ANSI safe ist.

So sähe das dann aus:
Delphi-Quellcode:
unit myWindows,

interface

uses
  Windows;

type
  LPCTSTR = PChar;
  LPCSTR = PAnsiChar;
  LPCWSTR = PWideChar;

{$EXTERNALSYM GetFileVersionInfoSize}
function GetFileVersionInfoSize(lptstrFilename: LPCTSTR; lpdwHandle: LPDWORD): DWORD; stdcall;
{$EXTERNALSYM GetFileVersionInfoSizeA}
function GetFileVersionInfoSizeA(lptstrFilename: LPCSTR; lpdwHandle: LPDWORD): DWORD; stdcall;
{$EXTERNALSYM GetFileVersionInfoSizeW}
function GetFileVersionInfoSizeW(lptstrFilename: LPCWSTR; lpdwHandle: LPDWORD): DWORD; stdcall;

implementation

function GetFileVersionInfoSize; external version name {$IFDEF UNICODE} 'GetFileVersionInfoSizeW{$ELSE} 'GetFileVersionInfoSizeA{$ENDIF};
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA';
function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';

end.
Das dieses so in den Delphi-Versionen vor Delphi 2007 nicht gemacht wurde, dafür kann ich auch nichts, aber man hat es eben selber in der Hand, ob man es vernünftig, korrekt und sicher hat
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Aug 2015 um 09:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#8

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:41
Aber auch dann muss man die richtigen Parametertypen verwenden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Info-Fenster von Windows anzeigen

  Alt 18. Aug 2015, 08:59
Aber auch dann muss man die richtigen Parametertypen verwenden.
Ja, immer den richtigen, je nachdem welche Version ich brauche:
  • Das was die Entwicklungsumgebung kann: GetFileVersionInfoSize -> nimm PChar
  • Ich will UNICODE: GetFileVersionInfoSizeW -> nimm PWideChar
  • Ich will ANSI: GetFileVersionInfoSizeA -> nimm PAnsiChar
Update
Genau das steht auch in der MSDN-Doku zum Datentyp LPCTSTR
Zitat:
LPCTSTR

An LPCWSTR if UNICODE is defined, an LPCSTR otherwise. For more information, see Windows Data Types for Strings.

This type is declared in WinNT.h as follows:
Code:
#ifdef UNICODE
 typedef LPCWSTR LPCTSTR;
#else
 typedef LPCSTR LPCTSTR;
#endif
Somit ist also
Delphi-Quellcode:
type
  LPCTSTR = PChar;
  LPCSTR = PAnsiChar;
  LPCWSTR = PWideChar;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Aug 2015 um 09:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz