Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi VerQueryValue不返回中文操作系统中的版权符号?_Delphi_Character Encoding_Delphi 7 - Fatal编程技术网

Delphi VerQueryValue不返回中文操作系统中的版权符号?

Delphi VerQueryValue不返回中文操作系统中的版权符号?,delphi,character-encoding,delphi-7,Delphi,Character Encoding,Delphi 7,我试图在简体中文操作系统中使用VerQueryValue显示EXE信息。所有文本均正确显示,但版权符号显示为“?”。这是我正在使用的代码 const CInfoStr : array[1..13] of string = ('FileVersion', 'CompanyName', 'FileDescription', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', '

我试图在简体中文操作系统中使用
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;
const
CInfoStr:字符串的数组[1..13]=
(“文件版本”,
“公司名称”,
“文件描述”,
“内部名称”,
“法律权利”,
“LegalTradeMarks”,
“原始文件名”,
“产品名称”,
“产品版本”,
“评论”,
“CurrentProgramVersion”,
“CurrentDatabaseVersion”,
“VersionDetails”);
类型
PTransBuffer=^TTransBuffer;
TTransBuffer=smallint的数组[1..13];
函数checkFileVerforAppreplaceLert(路径:字符串):布尔值;
变量
信息大小,
版本化,Wnd:DWORD;
值:PChar;
ValWide:PWideCHar;
新谷宽:宽弦;
VerBuf:指针;
pTrans:PTransBuffer;
TypeStr,
TransStr:字符串;
j:整数;
键路径:字符串;
NewFileVer:String;
OldFileVer:字符串;
ResVer:整数;
开始
结果:=假;
如果路径='',则
出口
尝试
//获取文件的版本
InfoSize:=GetFileVersioninfoSize(PChar(路径),Wnd);
如果是(InfoSize 0),则
开始
尝试
GetMem(VerBuf,InfoSize);
如果是GetFileVersionInfo(PChar(Path)、Wnd、InfoSize、VerBuf),那么
开始
如果VerQueryValue(VerBuf,PChar('\VarFileInfo\Translation'),指针(pTrans),VerSize)则
开始
TransStr:=IntToHex(pTrans^[1],4)+IntToHex(pTrans^[2],4);
TypeStr:='StringFileInfo\'+TransStr+'\'+CInfoStr[5]//获得版权
//如果VerQueryvalue(VerBuf、PChar(TypeStr)、Pointer(Value)、VerSize)则
如果VerQueryvalue(VerBuf、PChar(TypeStr)、Pointer(Value)、VerSize)则
开始
NewFileVer:=值;
//NewValWide:=值;
Updatelog('NewFileVer'+NewValWide);
//ShowMessage(“版权”+NewFileVer);
//MessageBoxW(Application.Handle、PWideCHar(NewFileVer)、PWideCHar('Err')、MB_-OKCANCEL);
终止
终止
终止
最后
尝试
FreeMem(VerBuf,InfoSize);
除了
终止
终止
结束//获取版本结束
除了
终止
终止
以下是为宽字符串编写的代码:

 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;
函数addWidePathToApplication_Reg(AppPath:WideString):布尔值;
变量
j:整数;
路径:宽字符串;
InfoSize,VerSize,Wnd:DWORD;
pTrans:PTransBuffer;
VerBuf:指针;
VerFlag:布尔型;
值:PWChar;
TypeStr,
TransStr:宽字符串;
开始
结果:=假;
PathWS:=(AppPath);
InfoSize:=GetFileVersioninfoSizeW(PWChar(AppPath),Wnd);
如果是(InfoSize 0),则
开始
GetMem(VerBuf,InfoSize);
尝试
如果是getFileVersionInfo(PWChar(AppPath)、Wnd、InfoSize、VerBuf),那么
开始
如果VerQueryValue(VerBuf,'\VarFileInfo\Translation',指针(pTrans),版本化),则
开始
VerFlag:=假;
TransStr:=IntToHex(pTrans^[1],4)+IntToHex(pTrans^[2],4);
对于j:=低(CInfoStr)到高(CInfoStr)do
开始
TypeStr:='StringFileInfo\'+TransStr+'\'+CInfoStr[j];
如果VerQueryvalueW(VerBuf、PWChar(TypeStr)、指针(Value)、版本),则
开始
UpdateLog('Vlaue'+值);
结果:=真;
终止
终止
终止
终止
最后
FreeMem(VerBuf,InfoSize);
终止
终止
终止
我不明白我做错了什么。我试着用WideString代替String。但这没什么区别

如能提供指导,将不胜感激


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

为了读取UTF-16,必须调用API函数的Unicode变体。这些函数的后缀为
W
。因此,与其调用映射到
VarQueryValueA
(8位ANSI变体)的
VarQueryValueW
,不如调用
VarQueryValueW

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

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


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

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

为了读取UTF-16,必须调用API函数的Unicode变体。这些函数的后缀为
W
。因此,与其调用映射到
VarQueryValueA
(8位ANSI变体)的
VarQueryValueW
,不如调用
VarQueryValueW

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

现在还不清楚在
WideC中使用此符号后,您将如何处理它