Merhabalar.
Bugün sürüm güncellemesi nedeniyle proje EXE dosyamın RESOURCE ( File Information ) kısımlarına eğileyim istedim.
Türkçe ve İngilizce dillerde içerik ile etiketlendirmek istedim. Daha önce sadece İngilizce harf kullanıyordum ve dil olarak daima EN (US) olarak kullanıyordum. Şimdi TR'yi eklerken çözemediğim bir sorun ile karşılaştım.
Delphi ile giriş yaparsam Türkçe dediğim halde İngilizce kalıyor ancak işini doğru yapıyor.

RESOURCE Hacker Delphi ile doğru oluşturulmuş EXE'nin ile VersionInfo kısmının çıktısını aldım.
Bu çıktısını aldığımı kendi RC dosyamdan aynı şekilde uygulamaya çalıştım...
Sonuç hüsran
Soru uzun oldu idare ediniz
Size üzerinde çalışılabilecek bir proje örneği de hazırlayıp bu başlığa ekliyorum.
Bugün sürüm güncellemesi nedeniyle proje EXE dosyamın RESOURCE ( File Information ) kısımlarına eğileyim istedim.
Türkçe ve İngilizce dillerde içerik ile etiketlendirmek istedim. Daha önce sadece İngilizce harf kullanıyordum ve dil olarak daima EN (US) olarak kullanıyordum. Şimdi TR'yi eklerken çözemediğim bir sorun ile karşılaştım.
Kod: (Select All)
1 VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS (VS_FF_SPECIALBUILD|VS_FF_PRERELEASE)
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041F04E6" // Lang=Turkish ( Turkish , 0x041F, decimal 1055), CharSet=Turkish (0x04E6, decimal 1254).
BEGIN
VALUE "CompanyName", "Yazılım\0"
VALUE "FileDescription", "TR Karakter Test ğüşiöçı ĞÜŞİÖÇI\0"
VALUE "FileVersion", "1.0.0.1\0"
VALUE "ProductVersion", "1.0\0"
VALUE "InternalName", "2018/07/11\0"
VALUE "LegalCopyright", "© 2017 Muharrem ARMAN. All Rights Reserved\0"
VALUE "LegalTrademarks", "Muharrem ARMAN<muharrem.arman@trt.net.tr>\0"
VALUE "OriginalFilename", "ProdKay_KoordModulu\0"
VALUE "ProductName", "TR Karakter Test ğüşiöçı ĞÜŞİÖÇI\0"
VALUE "SpecialBuild", "ARMAN\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x041F, 1254 // Turkish
END
END
Delphi ile giriş yaparsam Türkçe dediğim halde İngilizce kalıyor ancak işini doğru yapıyor.


RESOURCE Hacker Delphi ile doğru oluşturulmuş EXE'nin ile VersionInfo kısmının çıktısını aldım.
Bu çıktısını aldığımı kendi RC dosyamdan aynı şekilde uygulamaya çalıştım...
Kod: (Select All)
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
1 VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "040904E4"
{
VALUE "CompanyName", "Yazılım"
VALUE "FileDescription", "TR Karakter Test ğ\xFCşi\xF6\xE7ı Ğ\xDCŞİ\xD6\xC7I"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "2018/07/11"
VALUE "LegalCopyright", "\xA9 2017 Muharrem ARMAN. All Rights Reserved"
VALUE "LegalTrademarks", "Muharrem ARMAN<muharrem.arman@trt.net.tr>"
VALUE "OriginalFilename", "ProdKay_KoordModulu"
VALUE "ProgramID", "com.embarcadero.Resource_TR_Test"
VALUE "ProductName", "TR Karakter Test ğ\xFCşi\xF6\xE7ı Ğ\xDCŞİ\xD6\xC7I"
VALUE "ProductVersion", "1.0"
VALUE "Comments", "ARMAN"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409 0x04E4
}
}Sonuç hüsran

Soru uzun oldu idare ediniz

Size üzerinde çalışılabilecek bir proje örneği de hazırlayıp bu başlığa ekliyorum.
procedure TForm1.FormCreate(Sender: TObject);
function GetExeInfo(Dosya: string; Bilgi: Integer): string;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string =
( 'CompanyName' // 1
, 'FileDescription' // 2
, 'FileVersion' // 3
, 'InternalName' // 4
, 'LegalCopyright' // 5
, 'LegalTradeMarks' // 6
, 'OriginalFilename' // 7
, 'ProductName' // 8
, 'ProductVersion' // 9
, 'Comments'); // 10
type
PLandCodepage = ^TLandCodepage;
TLandCodepage = record
wLanguage,
wCodePage: word;
end;
var
dummy,
len: cardinal;
buf, pntr: pointer;
lang: string;
begin
len := GetFileVersionInfoSize(PChar(Dosya), dummy);
if len = 0
then RaiseLastOSError;
GetMem(buf, len);
try
if not GetFileVersionInfo(PChar(Dosya), 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 + '\'+ InfoStr[Bilgi] ), pntr, len){ and (@len <> nil)}
then result := PChar(pntr);
else ; //showmessagefmt('! res: %s', [ PChar(pntr) ]);
finally
FreeMem(buf);
end;
end;
begin
Memo1.Lines.Add( GetExeInfo(Application.ExeName, 2) );
end;
Saygılarımla
Muharrem ARMAN

Muharrem ARMAN





