![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хочу получить версию файла, но(+) [D5, Win2k]
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