How to get version info处的线程显示了获取FileVersion的代码,我需要获取其他值,包括我自己添加到VersionInfo表中的一些值。
如何使用C ++ Builder 10.2(东京)获得它们?
我曾经使用VerQueryValue方法在C ++ Builder 6.0中获得它们,但是它引发了太多类型异常。
我不知道如何将代码更改为C ++ Builder 10.2。
以下是我正在使用的实际代码:
class.h
class TaskDetail: UIViewController {
var Delegate: NoteDetailDelegate!
var SavingDetails = [String]()
var Index: Int?
@IBOutlet weak var TaskDetailsFiled: UITextView!
@IBAction func SaveTDF(_ sender: UIButton) {
UserDefaults.standard.set(TaskDetailsFiled.text, forKey: "Saved")
self.navigationController?.popViewController(animated: true)
}
class.cpp
struct TransArray
{
WORD LanguageID, CharacterSet;
};
DWORD VerInfo, VerSize;
HANDLE MemHandle;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
char QueryBlock[255];
String FFileVersion ;
答案 0 :(得分:1)
您的代码错误地混合了ANSI和UNICODE逻辑。 VerQueryValue()
是一个预处理器宏,它分别根据是否定义了VerQueryValueW()
映射到VerQueryValueA()
或UNICODE
。您的代码假设正在使用VerQueryValueA()
,但并非总是如此。在现代版本的C ++ Builder中,默认情况下将使用VerQueryValueW()
。
请尝试以下类似操作:
struct TransArray
{
WORD LanguageID, CharacterSet;
};
DWORD VerInfo, VerSize;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
String FFileName, FFileVersion;
...
#include <tchar.h>
String __fastcall TAppVersion::GetFileVersion(void)
{
String Result;
if (MemPtr && Array)
{
// Get the product version.
TCHAR QueryBlock[40];
_stprintf(QueryBlock, _T("\\StringFileInfo\\%04x%04x\\FileVersion"), Array[0].LanguageID, Array[0].CharacterSet);
if (VerQueryValue(MemPtr, QueryBlock, &BufferPtr, &BufferLength)) {
Result = String(static_cast<TCHAR*>(BufferPtr), BufferLength).Trim();
}
}
return Result;
}
//---------------------------------------------------
__fastcall TAppVersion::TAppVersion()
{
MemPtr = NULL;
Array = NULL;
FFileName = Application->ExeName;
DWORD Unused;
VerSize = GetFileVersionInfoSize(FFileName.c_str(), &Unused);
if (VerSize == 0) return;
MemPtr = new BYTE[VerSize];
if (GetFileVersionInfo(FFileName.c_str(), Unused, VerSize, MemPtr)) {
if (VerQueryValue(MemPtr, TEXT("\\VarFileInfo\\Translation"), &BufferPtr, &BufferLength) {
Array = (TransArray *) BufferPtr;
FFileVersion = GetFileVersion();
}
}
}
//-----------------------------------------------
__fastcall TAppVersion::~TAppVersion()
{
delete[] static_cast<BYTE*>(MemPtr);
}
//-----------------------------------------------
尽管实际上,您不应该完全依赖于现代代码中的TCHAR
:
struct TransArray
{
WORD LanguageID, CharacterSet;
};
DWORD VerInfo, VerSize;
LPVOID MemPtr, BufferPtr;
UINT BufferLength;
TransArray *Array;
UnicodeString FFileName, FFileVersion;
...
UnicodeString __fastcall TAppVersion::GetFileVersion(void)
{
UnicodeString Result;
if (MemPtr && Array)
{
// Get the product version.
WCHAR QueryBlock[40];
swprintf(QueryBlock, L"\\StringFileInfo\\%04x%04x\\FileVersion", Array[0].LanguageID, Array[0].CharacterSet);
if (VerQueryValueW(MemPtr, QueryBlock, &BufferPtr, &BufferLength)) {
Result = UnicodeString(static_cast<WCHAR*>(BufferPtr), BufferLength).Trim();
}
}
return Result;
}
//---------------------------------------------------
__fastcall TAppVersion::TAppVersion()
{
MemPtr = NULL;
Array = NULL;
FFileName = Application->ExeName;
DWORD Unused;
VerSize = GetFileVersionInfoSizeW(FFileName.c_str(), &Unused);
if (VerSize == 0) return;
MemPtr = new BYTE[VerSize];
if (GetFileVersionInfoW(FFileName.c_str(), Unused, VerSize, MemPtr)) {
if (VerQueryValueW(MemPtr, L"\\VarFileInfo\\Translation", &BufferPtr, &BufferLength) {
Array = (TransArray *) BufferPtr;
FFileVersion = GetFileVersion();
}
}
}
//-----------------------------------------------
__fastcall TAppVersion::~TAppVersion()
{
delete[] static_cast<BYTE*>(MemPtr);
}
//-----------------------------------------------
答案 1 :(得分:0)
前一段时间,我做了一些玩。它还不完整,我将其称为beta1。但是在这里。
标题:
class TAppVerInfo
{
public:
__fastcall TAppVerInfo(const wchar_t* pModPath);
__fastcall virtual ~TAppVerInfo(void);
__property System::String LanguagesCodePage = {read = GetCodePage};
__property System::String Comments[System::String LanId] = {read = GetComments};
__property System::String InternalName[System::String LanId] = {read = GetInternalName};
__property System::String ProductName[System::String LanId] = {read = GetProductName};
__property System::String CompanyName[System::String LanId] = {read = GetCompanyName};
__property System::String LegalCopyright[System::String LanId] = {read = GetLegalCopyright};
__property System::String ProductVersion[System::String LanId] = {read = GetProductVersion};
__property System::String FileDescription[System::String LanId] = {read = GetFileDescription};
__property System::String LegalTrademarks[System::String LanId] = {read = GetLegalTrademarks};
__property System::String PrivateBuild[System::String LanId] = {read = GetPrivateBuild};
__property System::String FileVersion[System::String LanId] = {read = GetFileVersion};
__property System::String OriginalFilename[System::String LanId] = {read = GetOriginalFilename};
__property System::String SpecialBuild[System::String LanId] = {read = GetSpecialBuild};
protected:
void *VerInfo;
System::String __fastcall GetCodePage(void);
System::String __fastcall GetComments(System::String LanId);
System::String __fastcall GetInternalName(System::String LanId);
System::String __fastcall GetProductName(System::String LanId);
System::String __fastcall GetCompanyName(System::String LanId);
System::String __fastcall GetLegalCopyright(System::String LanId);
System::String __fastcall GetProductVersion(System::String LanId);
System::String __fastcall GetFileDescription(System::String LanId);
System::String __fastcall GetLegalTrademarks(System::String LanId);
System::String __fastcall GetPrivateBuild(System::String LanId);
System::String __fastcall GetFileVersion(System::String LanId);
System::String __fastcall GetOriginalFilename(System::String LanId);
System::String __fastcall GetSpecialBuild(System::String LanId);
System::String __fastcall GetValue(const System::String& LanId, const wchar_t* pName);
};
和CPP:
__fastcall TAppVerInfo::TAppVerInfo(const wchar_t* pModPath)
{
DWORD dwUnused;
DWORD VerInfoSize = GetFileVersionInfoSize(pModPath, &dwUnused);
VerInfo = malloc(VerInfoSize);
if(VerInfo)
{
if(0 == GetFileVersionInfo(pModPath, 0, VerInfoSize, VerInfo))
{
free(VerInfo);
VerInfo = NULL;
throw Exception(SysErrorMessage(GetLastError()));
}
} //040904E4
}
//---------------------------------------------------------------------------
__fastcall TAppVerInfo::~TAppVerInfo(void)
{
if(VerInfo)
free(VerInfo);
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetCodePage(void)
{
System::String retVal;
if(VerInfo)
{
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate;
TAutoStringList tStr(new TStringList);
UINT i;
VerQueryValue(VerInfo,L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate);
for(i = 0; i < (cbTranslate/sizeof(LANGANDCODEPAGE)); i++)
tStr->Add(System::String().sprintf(L"%04x%04x", lpTranslate[i].wLanguage, lpTranslate[i].wCodePage));
retVal = tStr->CommaText;
}
return retVal;
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetComments(System::String LanId)
{
return GetValue(LanId, L"Comments");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetInternalName(System::String LanId)
{
return GetValue(LanId, L"InternalName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetProductName(System::String LanId)
{
return GetValue(LanId, L"ProductName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetCompanyName(System::String LanId)
{
return GetValue(LanId, L"CompanyName");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetLegalCopyright(System::String LanId)
{
return GetValue(LanId, L"LegalCopyright");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetProductVersion(System::String LanId)
{
return GetValue(LanId, L"ProductVersion");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetFileDescription(System::String LanId)
{
return GetValue(LanId, L"FileDescription");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetLegalTrademarks(System::String LanId)
{
return GetValue(LanId, L"LegalTrademarks");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetPrivateBuild(System::String LanId)
{
return GetValue(LanId, L"PrivateBuild");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetFileVersion(System::String LanId)
{
return GetValue(LanId, L"FileVersion");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetOriginalFilename(System::String LanId)
{
return GetValue(LanId, L"OriginalFilename");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetSpecialBuild(System::String LanId)
{
return GetValue(LanId, L"SpecialBuild");
}
//---------------------------------------------------------------------------
System::String __fastcall TAppVerInfo::GetValue(const System::String& LanId, const wchar_t* pName)
{
System::String retVal;
if(VerInfo)
{
System::String aPath(System::String().sprintf(L"\\StringFileInfo\\%s\\%s", LanId.c_str(), pName));
wchar_t *pBuf;
UINT uLen;
if(VerQueryValue(VerInfo, aPath.c_str(), (void**)&pBuf, &uLen))
retVal = System::String(pBuf);
}
return retVal;
}