function GetFileVersionInfomation2(const FileName: string; var info: TFileInfo;
UserDefine: string = ''): boolean;
const
SFInfo = '\StringFileInfo\';
var
VersionInfo: Pointer;
InfoSize: DWORD;
InfoPointer: Pointer;
Translation: Pointer;
VersionValue: string;
unused: DWORD;
begin unused := 0;
Result := False;
// InfoSize := GetFileVersionInfoSize(pchar(FileName),unused);
Infosize := GetFileVersionInfoSize('C:\Documents and Settings\Administrator\桌面\新建文件夹 (3)\Project1.exe',
unused);
if InfoSize > 0 then
begin
GetMem(VersionInfo, InfoSize);
Result := GetFileVersionInfo(pchar(FileName), 0, InfoSize, VersionInfo);
if Result then
begin
VerQueryValue(VersionInfo,'\VarFileInfo\Translation', Translation, InfoSize); VersionValue := SFInfo + IntToHex(LoWord(Longint(Translation^)),4) +
IntToHex(HiWord(Longint(Translation^)),4) + '\'; VerQueryValue(VersionInfo, pchar(VersionValue + 'CompanyName'),InfoPointer,InfoSize);
info.CommpanyName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileDescription'),InfoPointer,InfoSize);
info.FileDescription := string(pchar(InfoPointer)); VerQueryValue(VersionInfo, pchar(VersionValue + 'FileVersion'),InfoPointer,InfoSize);
info.FileVersion := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'InternalName'), InfoPointer,InfoSize);
info.InternalName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'LegalCopyright'),InfoPointer,InfoSize);
info.LegalCopyright := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'LegalTrades'),InfoPointer,InfoSize);
info.LegalTrades := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'OriginalFileName'),InfoPointer,InfoSize);
info.OriginalFileName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'ProductName'),InfoPointer,InfoSize);
info.ProductName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'ProductVersion'),InfoPointer,InfoSize);
info.ProductVersion := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'Comments'),InfoPointer,InfoSize);
info.Comments := string(pchar(InfoPointer)); if VerQueryValue(VersionInfo,'\',InfoPointer,InfoSize) then
info.VsFixedFileInfo := TVSFixedFileInfo(InfoPointer^);
if UserDefine <> '' then
begin
if VerQueryValue(VersionInfo,pchar(VersionValue+UserDefine),InfoPointer,InfoSize) then
info.UserDefineValue:=string(pchar(InfoPointer));
end;
end;
FreeMem(VersionInfo);
end;
end;在D6中的DLL和exe中调用都没有问题,但将代码放置到D2010编译的DLL中,调用时出现了问题。将代码放到D2010的exe文件中调用正常。
在DL中,跟踪发现程序运行到红色行时,再下一步就跳到了最后一个end上了。
UserDefine: string = ''): boolean;
const
SFInfo = '\StringFileInfo\';
var
VersionInfo: Pointer;
InfoSize: DWORD;
InfoPointer: Pointer;
Translation: Pointer;
VersionValue: string;
unused: DWORD;
begin unused := 0;
Result := False;
// InfoSize := GetFileVersionInfoSize(pchar(FileName),unused);
Infosize := GetFileVersionInfoSize('C:\Documents and Settings\Administrator\桌面\新建文件夹 (3)\Project1.exe',
unused);
if InfoSize > 0 then
begin
GetMem(VersionInfo, InfoSize);
Result := GetFileVersionInfo(pchar(FileName), 0, InfoSize, VersionInfo);
if Result then
begin
VerQueryValue(VersionInfo,'\VarFileInfo\Translation', Translation, InfoSize); VersionValue := SFInfo + IntToHex(LoWord(Longint(Translation^)),4) +
IntToHex(HiWord(Longint(Translation^)),4) + '\'; VerQueryValue(VersionInfo, pchar(VersionValue + 'CompanyName'),InfoPointer,InfoSize);
info.CommpanyName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileDescription'),InfoPointer,InfoSize);
info.FileDescription := string(pchar(InfoPointer)); VerQueryValue(VersionInfo, pchar(VersionValue + 'FileVersion'),InfoPointer,InfoSize);
info.FileVersion := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'InternalName'), InfoPointer,InfoSize);
info.InternalName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'LegalCopyright'),InfoPointer,InfoSize);
info.LegalCopyright := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'LegalTrades'),InfoPointer,InfoSize);
info.LegalTrades := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'OriginalFileName'),InfoPointer,InfoSize);
info.OriginalFileName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'ProductName'),InfoPointer,InfoSize);
info.ProductName := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'ProductVersion'),InfoPointer,InfoSize);
info.ProductVersion := string(pchar(InfoPointer)); VerQueryValue(VersionInfo,pchar(VersionValue + 'Comments'),InfoPointer,InfoSize);
info.Comments := string(pchar(InfoPointer)); if VerQueryValue(VersionInfo,'\',InfoPointer,InfoSize) then
info.VsFixedFileInfo := TVSFixedFileInfo(InfoPointer^);
if UserDefine <> '' then
begin
if VerQueryValue(VersionInfo,pchar(VersionValue+UserDefine),InfoPointer,InfoSize) then
info.UserDefineValue:=string(pchar(InfoPointer));
end;
end;
FreeMem(VersionInfo);
end;
end;在D6中的DLL和exe中调用都没有问题,但将代码放置到D2010编译的DLL中,调用时出现了问题。将代码放到D2010的exe文件中调用正常。
在DL中,跟踪发现程序运行到红色行时,再下一步就跳到了最后一个end上了。
解决方案 »
- 怎么清空ADOTable中的数据连接,,而不改变数据库
- 这是一个什么样的过程?
- AD祝小小和百合一生幸福!祝有情人终成着属!
- 请教WebSnap问题!
- 请教一个使用控键的问题!
- smtp邮件发送时间问题
- I am new here! 有没有多点的DELPHI 电子书下载啊 要入门的 谢谢哦
- ===== 如何实现用程序气象服务? =====
- API调用,紧急求助,我用Delphi在本地建立了一个专用消息队列,但不知道该如何创建一个消息并将它发送到
- 这问题,你们碰过吗?当网络突然断线时,程序提示'连接失败',怎么也退不出应用程序!
- 求助:delphi 2010 写的程序如何才能不带运行时发布????
- delphi pagecontrol 显示多窗口 后标签无法隐藏
type
TFileInfo=packed record
CommpanyName: String;
......
end;
经过跟踪发现dll传递进来的info存在问题,没有内存分配。修改后,CommpanyName元素访问出错,没有分配内存,更改为CommpanyName array[1..1024] of char ;问题解决
在D6中不存在这样的问题,不知为什么