Inno setup Inno安装程序获取在另一个应用程序中打开的超过2GB限制的文件大小

Inno setup Inno安装程序获取在另一个应用程序中打开的超过2GB限制的文件大小,inno-setup,pascalscript,Inno Setup,Pascalscript,我试图使用vincenzo.net上ISXKB的公共域代码返回文件大小 函数CloseHandle(hHandle:THandle):布尔值; 外部的CloseHandle@kernel32.dllstdcall'; 常数 {CreateFile()的某些常量。} 通用_READ=$80000000; 通用写入=40000000美元; 通用执行=20000000美元; 通用_ALL=$10000000; 文件共享读取=1; 文件共享写入=2; 文件共享删除=4; 创建_NEW=1; 创建_始终=

我试图使用vincenzo.net上ISXKB的公共域代码返回文件大小

函数CloseHandle(hHandle:THandle):布尔值;
外部的CloseHandle@kernel32.dllstdcall';
常数
{CreateFile()的某些常量。}
通用_READ=$80000000;
通用写入=40000000美元;
通用执行=20000000美元;
通用_ALL=$10000000;
文件共享读取=1;
文件共享写入=2;
文件共享删除=4;
创建_NEW=1;
创建_始终=2;
开放式_=3;
打开_始终=4;
截断_=5;
文件读取属性=$80;
文件写入属性=$100;
{通用Win32.}
无效的\u句柄\u值=-1;
函数CreateFile(
lpFileName:字符串;
dwDesiredAccess:红衣主教;
dwShareMode:基数;
lpSecurityAttributes:基数;
dwCreationDisposition:基数;
dwFlagsAndAttributes:基数;
hTemplateFile:Integer
):整数;
外部的CreateFileA@kernel32.dllstdcall';
函数GetFileSize(hFile:THandle;var lpFileSizeHigh:Integer):整数;
外部的GetFileSize@kernel32.dllstdcall';
函数GetTheFileSize(文件名:String):整数;
变量
hFile:THandle;
iSize:整数;
hSize:整数;
开始
hFile:=创建文件(文件名,
GENERIC\u READ,//所需访问权限。
文件共享读取+文件共享写入,
0,{安全属性。}
开放式,
文件\u属性\u临时,
0);
如果(无效的句柄值=hFile),则
开始
结果:=0;
出口
结束;
iSize:=GetFileSize(hFile,hSize);
闭合手柄(hFile);
结果:=iSize;
结束;

但是,这似乎没有按预期工作,并返回
0
,我认为这是因为它在
处退出,如果(无效的句柄\u值=hFile),那么结果:=0
。我传递给它的文件存在并且可以访问。有人能解释一下为什么这是失败的,或者提出一种替代方法吗?请注意,我不能使用内置的
FileSize
函数,因为它有2GB的限制,这对于我来说是不够的。

我假设您使用的是Unicode版本的Inno安装程序

因此,您必须使用Unicode版本的
CreateFile
,即
CreateFileW
,而不是
CreateFileA

external'CreateFileW@kernel32.dllstdcall';

无论如何,
GettheFileSize
实现(从现在起已失效的ISXKB)也有2 GB的限制:

此声明适用于最大为2 GB的文件

... 将文件大小的低32位部分作为整数检索,然后再次关闭文件


要支持64位大小,请将其更改为:

函数GetTheFileSize(文件名:String):Int64; ... 开始 ... 结果:=Int64(基数(iSize))+(Int64(基数(hSize))shl32; 结束;
无论如何,这有点过分了。正如您所发现的,如果另一个应用程序在不允许其他应用程序至少读取该文件的情况下打开了该文件(它在调用
CreateFile
时未指定
file\u SHARE\u read

请注意,在这种情况下也不起作用,因为它的实现与ISXKB的
GetTheFileSize
基本相同


有一个简单的解决方案,使用:

函数GetTheFileSize(文件名:String):Int64; 变量 FindRec:TFindRec; 开始 如果FindFirst(文件名,FindRec),则 开始 结果:=Int64(FindRec.SizeHigh)shl32+FindRec.SizeLow; FindClose(FindRec); 结束 其他的 开始 结果:=-1; 结束; 结束;