How to Read Version Resource

unit VerUnit;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    OpenDialog1: TOpenDialog;
    Edit5: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
 VerSize : DWORD;
 FName   : String;
 Zero    : THandle;
 PBlock  : Pointer;
 PS      : Pointer;
 Size    : UINT;
begin
 Edit1.Text := '';
 Edit2.Text := '';
 Edit3.Text := '';
 Edit4.Text := '';
 If OpenDialog1.Execute Then
 Begin
  Edit5.Text := OpenDialog1.FileName;
 // Get size of Version resource
 VerSize := GetFileVersionInfoSize(PChar(OpenDialog1.FileName), Zero);
  If VerSize = 0 Then
   Begin
    ShowMessage('No Info');
    Exit;
   End;
// Allocate memory
 GetMem(PBlock, VerSize);
// Get Version resource
 GetFileVersionInfo(PChar(OpenDialog1.FileName), 0, VerSize, PBlock);
// Get predefined string
 GetMem(PS, 256);
 VerQueryValue(PBlock, '\\StringFileInfo\\040904E4\\CompanyName',PS, Size);
 Edit1.Text := StrPas(PS);
 VerQueryValue(PBlock, '\\StringFileInfo\\040904E4\\FileDescription',PS, Size);
 Edit2.Text := StrPas(PS);
 VerQueryValue(PBlock, '\\StringFileInfo\\040904E4\\FileVersion',PS, Size);
 Edit3.Text := StrPas(PS);
 VerQueryValue(PBlock, '\\StringFileInfo\\040904E4\\ProductName',PS, Size);
 Edit4.Text := StrPas(PS);
End;
end;
end.