Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

миграция функции на D2010...


istok ©   (2010-03-18 12:44:00) 

при переносе данной ф-ции в D2010 имею следующую ошибку компиляции, которой не было в D7:
Incompatible types: 'AnsiString' and 'Pointer'

в коде комментом отмечено это место (Result := VerBufValue)


function FileVersionInfo(const sAppNamePath: TFileName): TFileVersionInfo;
var
 rSHFI: TSHFileInfo;
 iRet: Integer;
 VerSize: Integer;
 VerBuf: PChar;
 VerBufValue: Pointer;
 VerHandle: Cardinal;
 VerBufLen: Cardinal;
 VerKey: string;
 FixedFileInfo: PVSFixedFileInfo;

 // dwFileType, dwFileSubtype
 function GetFileSubType(FixedFileInfo: PVSFixedFileInfo) : string;
 begin
   case FixedFileInfo.dwFileType of

     VFT_UNKNOWN: Result := 'Unknown';
     VFT_APP: Result := 'Application';
     VFT_DLL: Result := 'DLL';
     VFT_STATIC_LIB: Result := 'Static-link Library';

     VFT_DRV:
       case
         FixedFileInfo.dwFileSubtype of
         VFT2_UNKNOWN: Result := 'Unknown Driver';
         VFT2_DRV_COMM: Result := 'Communications Driver';
         VFT2_DRV_PRINTER: Result := 'Printer Driver';
         VFT2_DRV_KEYBOARD: Result := 'Keyboard Driver';
         VFT2_DRV_LANGUAGE: Result := 'Language Driver';
         VFT2_DRV_DISPLAY: Result := 'Display Driver';
         VFT2_DRV_MOUSE: Result := 'Mouse Driver';
         VFT2_DRV_NETWORK: Result := 'Network Driver';
         VFT2_DRV_SYSTEM: Result := 'System Driver';
         VFT2_DRV_INSTALLABLE: Result := 'InstallableDriver';
         VFT2_DRV_SOUND: Result := 'Sound Driver';
       end;
     VFT_FONT:
        case FixedFileInfo.dwFileSubtype of
         VFT2_UNKNOWN: Result := 'Unknown Font';
         VFT2_FONT_RASTER: Result := 'Raster Font';
         VFT2_FONT_VECTOR: Result := 'Vector Font';
         VFT2_FONT_TRUETYPE: Result :='Truetype Font';
         else;
       end;
     VFT_VXD: Result :='Virtual Defice Identifier = ' +
         IntToHex(FixedFileInfo.dwFileSubtype, 8);
   end;
 end;

 function HasdwFileFlags(FixedFileInfo: PVSFixedFileInfo; Flag : Word) : Boolean;
 begin
   Result := (FixedFileInfo.dwFileFlagsMask and
             FixedFileInfo.dwFileFlags and
             Flag) = Flag;
 end;

 function GetFixedFileInfo: PVSFixedFileInfo;
 begin
   if not VerQueryValue(VerBuf, '', Pointer(Result), VerBufLen) then
     Result := nil
 end;

 function GetInfo(const aKey: AnsiString): AnsiString;
 begin
   Result := '';
   VerKey := Format('\StringFileInfo\%.4x%.4x\%s',
             [LoWord(Integer(VerBufValue^)),
              HiWord(Integer(VerBufValue^)), aKey]);
   if VerQueryValue(VerBuf, PChar(VerKey),VerBufValue,VerBufLen) then
     Result := VerBufValue; // <-- Incompatible types: 'AnsiString' and 'Pointer'
 end;

 function QueryValue(const aValue: string): string;
 begin
   Result := '';
   // obtain version information about the specified file
   if GetFileVersionInfo(PChar(sAppNamePath), VerHandle, VerSize, VerBuf) and
      // return selected version information
      VerQueryValue(VerBuf, '\VarFileInfo\Translation', VerBufValue, VerBufLen) then
        Result := GetInfo(aValue);
 end;

begin
 // Initialize the Result
 with Result do
 begin
   FileType := '';
   CompanyName := '';
   FileDescription := '';
   FileVersion := '';
   InternalName := '';
   LegalCopyRight := '';
   LegalTradeMarks := '';
   OriginalFileName := '';
   ProductName := '';
   ProductVersion := '';
   Comments := '';
   SpecialBuildStr:= '';
   PrivateBuildStr := '';
   FileFunction := '';
   DebugBuild := False;
   Patched := False;
   PreRelease:= False;
   SpecialBuild:= False;
   PrivateBuild:= False;
   InfoInferred := False;
 end;

 // Get the file type
 if SHGetFileInfo(PChar(sAppNamePath), 0, rSHFI, SizeOf(rSHFI),
   SHGFI_TYPENAME) <> 0 then
 begin
   Result.FileType := rSHFI.szTypeName;
 end;

 iRet := SHGetFileInfo(PChar(sAppNamePath), 0, rSHFI, SizeOf(rSHFI), SHGFI_EXETYPE);
 if iRet <> 0 then
 begin
   // determine whether the OS can obtain version information
   VerSize := GetFileVersionInfoSize(PChar(sAppNamePath), VerHandle);
   if VerSize > 0 then
   begin
     VerBuf := AllocMem(VerSize);
     try
       with Result do
       begin
         CompanyName      := QueryValue('CompanyName');
         FileDescription  := QueryValue('FileDescription');
         FileVersion      := QueryValue('FileVersion');
         InternalName     := QueryValue('InternalName');
         LegalCopyRight   := QueryValue('LegalCopyRight');
         LegalTradeMarks  := QueryValue('LegalTradeMarks');
         OriginalFileName := QueryValue('OriginalFileName');
         ProductName      := QueryValue('ProductName');
         ProductVersion   := QueryValue('ProductVersion');
         Comments         := QueryValue('Comments');
         SpecialBuildStr  := QueryValue('SpecialBuild');
         PrivateBuildStr  := QueryValue('PrivateBuild');
         // Fill the  VS_FIXEDFILEINFO structure
         FixedFileInfo    := GetFixedFileInfo;
         DebugBuild       := HasdwFileFlags(FixedFileInfo,VS_FF_DEBUG);
         PreRelease       := HasdwFileFlags(FixedFileInfo,VS_FF_PRERELEASE);
         PrivateBuild     := HasdwFileFlags(FixedFileInfo,VS_FF_PRIVATEBUILD);
         SpecialBuild     := HasdwFileFlags(FixedFileInfo,VS_FF_SPECIALBUILD);
         Patched          := HasdwFileFlags(FixedFileInfo,VS_FF_PATCHED);
         InfoInferred     := HasdwFileFlags(FixedFileInfo,VS_FF_INFOINFERRED);
         FileFunction     := GetFileSubType(FixedFileInfo);
       end;
     finally
       FreeMem(VerBuf, VerSize);
     end
   end;
 end
end;


как правильно пофиксить ошибку?


POP   (2010-03-21 02:03:00) [1]

Thanks.


Loginov Dmitry   (2010-03-20 22:59:00) [2]

http://edn.embarcadero.com/article/38703


POP   (2010-03-20 21:17:00) [3]

Игорь Шевченко

> страшно жить. почему бы не почитать про миграцию на сайте
> embarcadero ? Там даже по-русски есть, насколько мне память
> не изменяет.


Можешь дать ссылку на эти инструкции?

Все что я нашел, это их предложение выслать в бумажном виде. Все на английском.


Игорь Шевченко   (2010-03-18 16:12:00) [4]

страшно жить. почему бы не почитать про миграцию на сайте embarcadero ? Там даже по-русски есть, насколько мне память не изменяет.


istok   (2010-03-18 13:10:00) [5]

итого сделал так, вроде работает:)

 function GetInfo(const aKey: AnsiString): string;
 begin
   Result := '';
   VerKey := Format('\StringFileInfo\%.4x%.4x\%s',
             [LoWord(Integer(VerBufValue^)),
              HiWord(Integer(VerBufValue^)), aKey]);
   if VerQueryValue(VerBuf, PChar(VerKey),VerBufValue,VerBufLen) then
     Result := StrPas(PWideChar(VerBufValue));
 end;


istok   (2010-03-18 13:02:00) [6]

подозреваю что проблема в том, что теперь есть 2 версии StrPas и компилятор не может понять. какую именно использовать, т.к. передается pointer - так?


istok   (2010-03-18 12:58:00) [7]

поправка:

в старой версии было
Result := StrPas(VerBufValue);

на что сейчас пишет "Ambiguous overloaded call to 'StrPas'"


Наверх

Титульная страница Поиск, карта сайта Написать письмо