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

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

Хочу получить версию файла, но(+) [D5, Win2k]


Страницы:   1 2

UNIVERSAL ©   (2004-03-18 11:14:00) 

...но если я эту функцию выполняю в простом проекте, то всё ок. по крайней мере нет exception-ов и прога нормально регирует, но если я её пихаю в DLL, а потом делаю вызов, то происходит exception. Вопрос, как обычно, что я делаю не так?
Код в DLL

function GetFileInfoValue(lpData:Pointer; LanguageInfo:string; From: string): string;stdcall;
var str:pchar;dstr:cardinal;
begin
//Константа From может быть следующей: "CompanyName", "FileDescription",
//"FileVersion", "InternalName", "LegalCopyright", "OriginalFilename",
//"ProductName","ProductVersion", "Comments"
 VerQueryValue(lpData,pchar('\StringFileInfo\'+LanguageInfo+'\'+From),
                pointer(str), dstr);
 if dstr>0 then Result := str else Result := '';
end;

function GetFileInfo(FileName:string;What:string):string;stdcall;
var DataSize:cardinal; Trans,lpData:Pointer;temp:cardinal;FLanguageInfo,LangCharSet:string;
h:cardinal;TransSize:cardinal;
begin
DataSize:=GetFileVersionInfoSize(PChar(Filename),h);
if DataSize>0 then
 begin
//Здесь, Filename - имя файла, содержащего версию файла, а BuffSize - переменная, в которую будет записано количество байт, занимаемых информацией о версии. Функция запишет в переменную BuffSize число меньшее 1, если информация о версии отсутствует или произошла ошибка.
//После этого, выделив буфер, мы запрашиваем сам блок информации о версии файла.
 lpData:=AllocMem(DataSize);
 GetFileVersionInfo(pchar(Filename) ,cardinal(0),DataSize,lpData);
//Но это еще не все. Информация о версии является многоязычным ресурсом, поэтому следует узнать список языков, которые поддерживаются версией файла.
  VerQueryValue(lpData,'\VarFileInfo\Translation', Trans,TransSize);
  if TransSize>=4 then
   begin
    temp:=0;
    StrLCopy(@temp, pchar(Trans), 2);
    LangCharSet:=IntToHex(temp, 4);
    StrLCopy(@temp, pchar(Trans)+2, 2);
    FLanguageInfo := LangCharSet+IntToHex(temp, 4);
//Выяснив язык, запрашиваем информацию, которая требуется при помощи вот такой функции:
    Result:=GetFileInfoValue(lpData, FLanguageInfo,What);
   end else Result:=''
 end else Result:='';
 freemem(lpData);
end;

код в проекте

function GetFileInfo(FileName:string;What:String):string; external 'pf.dll' name 'GetFileInfo';
procedure TForm1.Button2Click(Sender: TObject);
var fv:string;
begin
// fv:=GetFileInfo('c:\alphapri\alphatab.mdb','FileVersion');
 fv:=GetFileInfo('D:\WINNT\system32\notepad.exe','FileVersion');
MessageBox(0,PChar(fv),nil,MB_OK );
end;


Игорь Шевченко   (2004-03-18 15:33:00) [21]

Потому что надо передавать в DLL адрес для буфера, куда будет класться нужная информация.
И функцию нужно объявить, как
  function GetFileInfo(const FileName, What: PChar; Buffer: PChar; BufferSize: Integer): Integer;stdcall;


Возвращать длину положенной в Buffer информации.
В DLL, вместо result использовать переданный буфер.


UNIVERSAL   (2004-03-18 15:18:00) [22]

Заменил все string на PChar. Ругань в таком диком формате прекратилась , но цель не достигнута. Теперь почему то возвращает всегда пустые строки, хотя версия файла точно есть и из приложения я её получаю из DLL - нет. Может ещё чем подскажите?


UNIVERSAL   (2004-03-18 13:56:00) [23]

Большое спасибо попробую. Действительно облажался. Читайте доки они рулезные.


BiN   (2004-03-18 12:50:00) [24]

string замени на Pchar
когда создаешь dll в дельфи, внимательно читай комментарий сразу после строки library Project1;


UNIVERSAL   (2004-03-18 12:47:00) [25]

Не понял. Что через "," написать чтоли?


BiN   (2004-03-18 11:21:00) [26]

LanguageInfo: string;From: string


Страницы:   1 2

Наверх

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