Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.16;
Скачать: CL | DM;

Вниз

миграция функции на D2010...   Найти похожие ветки 

 
istok   (2010-03-18 12:44) [0]

при переносе данной ф-ции в 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;


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


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

поправка:

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

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


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

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


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

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

 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;


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

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


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

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

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


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

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


 
Loginov Dmitry ©   (2010-03-20 22:59) [6]

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


 
POP   (2010-03-21 02:03) [7]

Thanks.



Страницы: 1 вся ветка

Текущий архив: 2011.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1309187909
ShegAI
2011-06-27 19:18
2011.10.16
StayOnTop при длительных операциях


2-1309002914
Тимофей Ю.
2011-06-25 15:55
2011.10.16
неправильно выбран тип числа


15-1308570020
Sergey
2011-06-20 15:40
2011.10.16
оживет ли винт?


15-1308725956
SQLEXPRESS
2011-06-22 10:59
2011.10.16
декомпилировать приложение C#


15-1308688197
Юрий
2011-06-22 00:29
2011.10.16
С днем рождения ! 22 июня 2011 среда