我想做个动态的About但是下面程序不知为什么实现不了。请大家指正!!!(50分)

  • 主题发起人 主题发起人 shaozen
  • 开始时间 开始时间
S

shaozen

Unregistered / Unconfirmed
GUEST, unregistred user!
unit About;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TAboutDlg = class(TForm)
GroupBox1: TGroupBox;
Image1: TImage;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
AboutDlg: TAboutDlg;

implementation

{$R *.dfm}


procedure TAboutDlg.Button1Click(Sender: TObject);
begin
Close();
end;


procedure TAboutDlg.FormCreate(Sender: TObject);
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
S: string;
n, i: DWORD;
Buf: PChar;
Value: PChar;
Len:Uint;
begin
S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S), n);
if n > 0 then
begin

Buf := AllocMem(n);
//GetMem(Buf,n);
GetFileVersionInfo(PChar(S), 0, n, Buf);
Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n));
for i := 1 to InfoNum do
if VerQueryValue(Buf,PChar('StringFileInfo/08040000/' + InfoStr), Pointer(Value), Len) then
Memo1.Lines.Add(InfoStr + ' = '+ Value);
FreeMem(Buf, n);
end
else
Memo1.Lines.Add('No version information found');
end;

end.
 
procedure TAboutDlg.FormCreate(Sender: TObject);
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
S: string;
n, i: DWORD;
Buf: PChar;
Value: PChar;
Len:Uint;
[red]M: PDWORD;[/red]
begin
S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S), n);
if n > 0 then
begin

Buf := AllocMem(n);
//GetMem(Buf,n);
GetFileVersionInfo(PChar(S), 0, n, Buf);
Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n));

[red] VerQueryValue(Buf, PChar('VarFileInfo/Translation'),Pointer(M),Len);
S := IntToHex(LongRec(M^).Lo,4) + IntToHex(LongRec(M^).Hi,4);[/red]

for i := 1 to InfoNum do
if VerQueryValue(Buf,PChar([red]'StringFileInfo'+S+/' [/red]+ InfoStr), Pointer(Value), Len) then
Memo1.Lines.Add(InfoStr + ' = '+ Value);
FreeMem(Buf, n);
end
else
Memo1.Lines.Add('No version information found');
end;
 
改变部分的代码:
...
VerQueryValue(Buf, PChar('VarFileInfo/Translation'),Pointer(M),Len);
S := IntToHex(LongRec(M^).Lo,4) + IntToHex(LongRec(M^).Hi,4);[/
...
if VerQueryValue(Buf,PChar('StringFileInfo'+S+/'+ InfoStr), Pointer(Value), Len) then

 
接受答案了.
 
后退
顶部