gpt4 book ai didi

delphi - VerQueryValue 在中文操作系统中不返回版权符号?

转载 作者:行者123 更新时间:2023-12-02 04:22:22 25 4
gpt4 key购买 nike

我正在尝试在简体中文操作系统中使用VerQueryValue显示EXE信息。所有文字都正确显示,但版权符号显示为“?” 。这是我正在使用的代码。

   const
CInfoStr : array[1..13] of string =
('FileVersion',
'CompanyName',
'FileDescription',
'InternalName',
'LegalCopyright',
'LegalTradeMarks',
'OriginalFileName',
'ProductName',
'ProductVersion',
'Comments',
'CurrentProgramVersion',
'CurrentDatabaseVersion',
'VersionDetails');

type

PTransBuffer = ^TTransBuffer;
TTransBuffer = array[1..13] of smallint;


Function CheckFileVerForAppReplaceAlert(Path : String): Boolean;
var
InfoSize,
VerSize, Wnd : DWORD;
Value : PChar;
ValWide : PWideCHar;
NewValWide : WideString;
VerBuf : pointer;
pTrans : PTransBuffer;
TypeStr,
TransStr : string;
j : Integer;

KeyPath : String;
NewFileVer : String;
OldFileVer : String;

ResVer : Integer;
begin
Result := False;
If Path = '' then
exit;
try
// Get Version of File
InfoSize := GetFileVersioninfoSize(PChar(Path), Wnd);
if (InfoSize <> 0) then
begin
try
GetMem(VerBuf, InfoSize);
if GetFileVersionInfo(PChar(Path), Wnd, InfoSize, VerBuf) then
begin
if VerQueryValue(VerBuf, PChar('\VarFileInfo\Translation'),Pointer(pTrans), VerSize) then
begin
TransStr := IntToHex(pTrans^[1], 4) + IntToHex(pTrans^[2], 4);
TypeStr := 'StringFileInfo\' + TransStr + '\' + CInfoStr[5]; //Get The Copyright
//if VerQueryvalue(VerBuf, PChar(TypeStr),Pointer(Value), VerSize) then
if VerQueryvalue(VerBuf, PChar(TypeStr),Pointer(Value), VerSize) then
begin
NewFileVer := Value;
//NewValWide :=Value;
Updatelog('NewFileVer ' + NewValWide);
// ShowMessage('Copyright ' + NewFileVer);
//MessageBoxW(Application.Handle, PWideCHar(NewFileVer) , PWideChar('Err'),MB_OKCANCEL);
end;

end;
end
finally
Try
FreeMem(VerBuf, InfoSize);
Except
End;
end;
end //end Of taking version
except
end;
end;

这是为宽字符串编写的代码:

 Function AddWidePathToAppList_Reg(AppPath : WideString): Boolean ;
Var
j : Integer;
PathWS : WideString;
InfoSize,VerSize, Wnd: DWORD;
pTrans: PTransBuffer;
VerBuf: pointer;
VerFlag: Boolean;
Value: PWChar;
TypeStr,
TransStr: WideString;
Begin
Result := False;
PathWS := (AppPath);
InfoSize := GetFileVersioninfoSizeW(PWChar(AppPath), Wnd);
if (InfoSize <> 0) then
begin
GetMem(VerBuf, InfoSize);
try
if GetFileVersionInfoW(PWChar(AppPath), Wnd, InfoSize, VerBuf) then
begin
if VerQueryValueW(VerBuf, '\VarFileInfo\Translation',Pointer(pTrans), VerSize) then
begin
VerFlag:=False;
TransStr := IntToHex(pTrans^[1], 4) + IntToHex(pTrans^[2], 4);
for j := Low(CInfoStr) to High(CInfoStr) do
begin
TypeStr := 'StringFileInfo\' + TransStr + '\' + CInfoStr[j];
if VerQueryvalueW(VerBuf, PWChar(TypeStr),Pointer(Value), VerSize) then
begin
UpdateLog('Vlaue ' + Value);
Result := True;
end;
end;
end;
end;
finally
FreeMem(VerBuf, InfoSize);
end;
end;

end;

我不明白我做错了什么。我尝试使用 WideString 代替 String。但这没有什么区别。

指导将不胜感激。

提前致谢

最佳答案

返回 ? 表示系统从 UTF-16 转换为 ANSI,但由于该字符不存在于 ANSI 代码页中而失败。您正在使用 ANSI 版本的 Delphi,因此这是预期的行为。

为了读出 UTF-16,您必须调用 API 函数的 Unicode 变体。这些是带有 W 后缀的函数。因此,不要调用映射到 VarQueryValueA(8 位 ANSI 变体)的 VarQueryValue,而是调用 VarQueryValueW

您需要将指针传递给 WideChar 数组。最简单的方法是使用 WideString,然后转换为 PWideChar

当您将这个符号放入 WideChar 中后,尚不清楚您将如何处理它。系统无法将其转换为您的 ANSI 代码页,这是不可能的,您也没有更好的成功希望。因此您需要使用 Unicode 控件来显示文本。

您声称您已经尝试了我上面描述的操作,但仍然看到 ? 字符。只有当您的调试机制也仅限于 ANSI 代码页时,才会发生这种情况。

关于delphi - VerQueryValue 在中文操作系统中不返回版权符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com