PDA

View Full Version : سوال: خواندن ورژن فایل



peymanjon
سه شنبه 17 بهمن 1391, 09:04 صبح
سلام...
من با کد سی شارپ زیر version یک فایل دلفی با پسوند bpl. را می خوانم که ورژن را اشتباه به من می ده یعنی می نویسه 1.0.0.0 که در اصل ورژن فایل من 1.1.0.20 می باشد ولی با کد دلفی درست می خونم . از دوستان دلفی کار کسی می تونه به من کمک کنه که چرا من به این مشکل می خورم؟من مشکلی برای خواندن dll با این تابع ندارم ولی برای چند تا فایل bpl اشتباه ورژن را می دهد.
من یکی از فایل ها را ضمیمه می کنم تا تابع خود را بروی آن تست کنید و در صورتیکه ورژن را درست گرفتید من را راهنمایی کنید (ورژن صحیح 1.1.0.20 فایل ضمیمه)

FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(PathFile);
MessageBox.Show("File: " + myFileVersionInfo.ProductVersion + '\n' +
"Version number: " + myFileVersionInfo.FileVersion);

من این تاپیک را در اینجا زدم تا دوستان دلفی کار بتونن به من راهنمایی بهتری بکنند.
ممنون.

Mask
سه شنبه 17 بهمن 1391, 12:44 عصر
اگه سرچ کنید زود تر به نتیجه میرسید.


type
TEXEVersionData = record
CompanyName,
FileDescription,
FileVersion,
InternalName,
LegalCopyright,
LegalTrademarks,
OriginalFileName,
ProductName,
ProductVersion,
Comments,
PrivateBuild,
SpecialBuild: string;
end;

function GetEXEVersionData(const FileName: string): TEXEVersionData;
type
PLandCodepage = ^TLandCodepage;
TLandCodepage = record
wLanguage,
wCodePage: word;
end;
var
dummy,
len: cardinal;
buf, pntr: pointer;
lang: string;
begin
// If file not exists return
if not FileExists(FileName) then
Exit;

len := GetFileVersionInfoSize(PChar(FileName), dummy);
if len = 0 then
RaiseLastOSError;
GetMem(buf, len);
try
if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then
RaiseLastOSError;

if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then
RaiseLastOSError;

lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]);

if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\CompanyName'), pntr, len){ and (@len <> nil)} then
result.CompanyName := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileDescription'), pntr, len){ and (@len <> nil)} then
result.FileDescription := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileVersion'), pntr, len){ and (@len <> nil)} then
result.FileVersion := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\InternalName'), pntr, len){ and (@len <> nil)} then
result.InternalName := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalCopyright'), pntr, len){ and (@len <> nil)} then
result.LegalCopyright := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalTrademarks'), pntr, len){ and (@len <> nil)} then
result.LegalTrademarks := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\OriginalFileName'), pntr, len){ and (@len <> nil)} then
result.OriginalFileName := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductName'), pntr, len){ and (@len <> nil)} then
result.ProductName := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductVersion'), pntr, len){ and (@len <> nil)} then
result.ProductVersion := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\Comments'), pntr, len){ and (@len <> nil)} then
result.Comments := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\PrivateBuild'), pntr, len){ and (@len <> nil)} then
result.PrivateBuild := PChar(pntr);
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\SpecialBuild'), pntr, len){ and (@len <> nil)} then
result.SpecialBuild := PChar(pntr);
finally
FreeMem(buf);
end;
end;

procedure Tfrm_Main.btn_GetVersioninfoClick(Sender: TObject);
var
Data: TEXEVersionData;
begin
if od_ExeFile.Execute then
begin
Data:= GetEXEVersionData(od_ExeFile.FileName);
with Memo1.Lines do
begin
Add('CompanyName : ' + Data.CompanyName);
Add('FileDescription : ' + Data.FileDescription);
Add('FileVersion : ' + Data.FileVersion);
Add('InternalName : ' + Data.InternalName);
Add('LegalCopyright : ' + Data.LegalCopyright);
Add('LegalTrademarks :' + Data.LegalTrademarks);
Add('OriginalFileName : ' + Data.OriginalFileName);
Add('ProductName : ' + Data.ProductName);
Add('ProductVersion : ' + Data.ProductVersion);
Add('Comments : ' + Data.Comments);
Add('PrivateBuild : ' + Data.PrivateBuild);
Add('SpecialBuild : ' + Data.SpecialBuild);
end;
end;
end;

peymanjon
سه شنبه 17 بهمن 1391, 13:59 عصر
قصد من کد دلفی نبود علتش می خواستم ولی این کدی که گذاشتی خیلی به دردم خورد چون الان ورژن مطابق با سی شارپ شد. کد من اینجوری بود:

function GetFileVersion(const sFilename: String): String;
var
pInfo,pPointer: Pointer;
nSize: DWORD;
nHandle: DWORD;
pVerInfo: PVSFIXEDFILEINFO;
nVerInfoSize: DWORD;
nValue1,nValue2,nValue3,nValue4: Integer;
begin
Result:='?.?.?.?';
nSize:=GetFileVersionInfoSize(PChar(sFilename),nHa ndle);
if (nSize<>0) then begin
GetMem(pInfo,nSize);
try
FillChar(pInfo^,nSize,0);

if (GetFileVersionInfo(PChar(sFilename),nHandle,nSize ,pInfo)) then begin
nVerInfoSize:=SizeOf(VS_FIXEDFILEINFO);
GetMem(pVerInfo,nVerInfoSize);
try
FillChar(pVerInfo^,nVerInfoSize,0);
pPointer:=Pointer(pVerInfo);
VerQueryValue(pInfo,'\',pPointer,nVerInfoSize);
nValue1:=PVSFIXEDFILEINFO(pPointer)^.dwFileVersion MS shr 16;
nValue2:=PVSFIXEDFILEINFO(pPointer)^.dwFileVersion MS and $FFFF;
nValue3:=PVSFIXEDFILEINFO(pPointer)^.dwFileVersion LS shr 16;
nValue4:=PVSFIXEDFILEINFO(pPointer)^.dwFileVersion LS and $FFFF;

Result:=IntToStr(nValue1)+'.'+IntToStr(nValue2)+'. '+IntToStr(nValue3)+'.'+IntToStr(nValue4);
finally
FreeMem(pVerInfo,nVerInfoSize);
end;
end;
finally
FreeMem(pInfo,nSize);
end;
end;
end;
ممنون