论坛风格切换切换到宽版
  • 3664阅读
  • 8回复

请教老虎版主修正这些脚本 [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 正序阅读 0 发表于: 2015-08-14
这些都是比较老的脚本,不知道怎么修正,压缩包里面还有其它一些脚本,由于我没测试环境,也不知道怎么测试,也不打算去弄了;
希望老虎版主能抽空修正这下面几个脚本:

2011/05/18  22:15             1,405 如何检测当前显示分辨率和颜色深度.txt
2011/06/28  17:12             2,200 如何检测文件系统的类型.txt
2011/05/18  22:06             1,583 如何注销如果用户不是管理员.txt
2011/05/18  22:00             2,294 如何浏览文件.txt
2011/05/18  22:18             1,957 如何获得驱动器的数量和序列号.txt
2011/05/18  22:18             1,718 如何获得驱动器类型.txt
无法确定.rar (32 K) 下载次数:11
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 8 发表于: 2015-08-16
回 7楼(gnatix) 的帖子
gnatix:如何浏览文件.iss; ISX 3.0.6.1;#ifdef Unicode....... (2015-08-16 03:49) 

谢谢老虎版主解答,有些自己修正了,如何获得驱动器的卷标和序列号.iss、如何获得驱动器类型.iss这两个困扰了很久
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 7 发表于: 2015-08-16
如何浏览文件.iss

; ISX 3.0.6.1
;
#ifdef Unicode
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=BrowseFile
AppVerName=BrowseFile
DefaultDirName=BrowseFile
DisableStartupPrompt=true
Uninstallable=false
Compression=bzip
CreateAppDir=false
DisableProgramGroupPage=true

[Tasks]
Name: askini; Description: 选择一个自定义 INI 文件; GroupDescription: 配置:

[Code]
type
  TOpenFileName = record
    lStructSize: Longint;
    hwndOwner: Longint;
    hInstance: Longint;
    lpstrFilter: String;
    lpstrCustomFilter: String;
    nMaxCustFilter: Longint;
    nFilterIndex: Longint;
    lpstrFile: String;
    nMaxFile: Longint;
    lpstrFileTitle: String;
    nMaxFileTitle: Longint;
    lpstrInitialDir: String;
    lpstrTitle: String;
    Flags: Longint;
    nFileOffset: Word;
    nFileExtension: Word;
    lpstrDefExt: String;
    lCustData: Longint;
    lpfnHook: Longint;
    lpTemplateName: String;
  end;

function GetOpenFileName(var lpofn: TOpenFileName): Boolean; external
'GetOpenFileName{#A}@comdlg32.dll';

Const OFN_HIDEREADONLY = $4;

function NextButtonClick(CurPage: Integer): Boolean;
var
  F: TOpenFileName;
  S: String;
  z : char;
  hwnd: Longint;
begin
  // by default go to next page
  Result := true;
  z := Chr(0);
  hwnd := StrToInt(ExpandConstant('{wizardhwnd}'));
  // if curpage is wpSelectTasks
  if CurPage = wpSelectTasks then
  begin
    if IsTaskSelected('askini') then
begin
      // set defailt file
      S := 'config.ini';
      // get enough space
      SetLength(S, 512);
      // set wizard HWND as owner
      F.hwndOwner := hwnd;
      // set structure size
      F.lStructSize := 76;
      // set S buffer for filename
      F.lpstrFile := S;
      F.nMaxFile := Length(S);
      // set dialog title
      F.lpstrTitle := '选择配置文件';
      // set filters
      F.lpstrFilter := 'INI 文件 (*.ini)' + z + '*.ini' + z +
                       '所有文件 (*.*)' + z + '*.*' + z + z ;
      // set flags
      F.Flags := OFN_HIDEREADONLY;
      // set initial dir as system
      F.lpstrInitialDir := ExpandConstant('{sys}');
      if GetOpenFileName(F) then begin
        MsgBox( '你选择的文件是:'+ #13#10 + #13#10 + S , mbInformation, MB_OK );
        Result := true;
      end
      else
       Result := false;
    end;
  end;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2015-08-16
如何获得驱动器类型.iss

; ISX 3.0.6.2
;
#ifdef Unicode
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=DriveType
AppVerName=DriveType
Uninstallable=false
UpdateUninstallLogAppName=false
DisableDirPage=true
DisableProgramGroupPage=true
DefaultDirName={pf}\Drvtype
DisableStartupPrompt=true

[Code]
function GetDriveType( lpDisk: String ): Integer;
external 'GetDriveType{#A}@kernel32.dll stdcall';
const
  DRIVE_UNKNOWN = 0; // The drive type cannot be determined.
  DRIVE_NO_ROOT_DIR = 1; // The root path is invalid. For example, no volume is mounted at the path.
  DRIVE_REMOVABLE = 2; // The disk can be removed from the drive.
  DRIVE_FIXED = 3; // The disk cannot be removed from the drive.
  DRIVE_REMOTE = 4; // The drive is a remote (network) drive.
  DRIVE_CDROM = 5; // The drive is a CD-ROM drive.
  DRIVE_RAMDISK = 6; // The drive is a RAM disk.

// function to convert disk type to string
function DriveTypeString( dtype: Integer ): String;
begin
  case dtype of
    DRIVE_NO_ROOT_DIR : Result := '根目录无效';  //'Root path invalid';
    DRIVE_REMOVABLE : Result := '可移动盘';      //'Removable';
    DRIVE_FIXED : Result := '硬盘';              //'Fixed';
    DRIVE_REMOTE : Result := '网络';             //'Network';
    DRIVE_CDROM : Result := '光盘';              //'CD-ROM';
    DRIVE_RAMDISK : Result := '内存';            //'Ram disk';
  else
    Result := '未知';                            //'Unknown';
  end;
end;

function InitializeSetup(): Boolean;
var srcdisk: String;
    disktype: Integer;
begin
  Result := true;
  // get drive from where setup was launched
  srcdisk := AddBackSlash( ExtractFileDrive( ExpandConstant('{srcexe}') ) ) ;
  // get number type of disk
  disktype := GetDriveType( srcdisk );
  // show which type of disk it is
  MsgBox( Format( '安装程序从 %s 启动,类型为“%s”。', [srcdisk, DriveTypeString( disktype )] ) , mbInformation, MB_OK );
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 5 发表于: 2015-08-16
如何获得驱动器的卷标和序列号.iss

; ISX 3.0.6.2
;
#ifdef Unicode
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=DriveVolume
AppVerName=DriveVolume
Uninstallable=false
UpdateUninstallLogAppName=false
DisableDirPage=true
DisableProgramGroupPage=true
DefaultDirName={pf}\DriveVolume
DisableStartupPrompt=true

[_ISTool]
EnableISX=true

[Code]
function GetVolumeInformation(
lpRootPathName: String;
lpVolumeNameBuffer: String;
nVolumeNameSize: LongInt;
var lpVolumeSerialNumber: LongInt;
lpMaximumComponentLength: LongInt;
lpFileSystemFlags : LongInt;
lpFileSystemNameBuffer: String;
nFileSystemNameSize: LongInt ) : Integer;
external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
{ // API declaration in C
BOOL GetVolumeInformation(
  LPCTSTR lpRootPathName,           // root directory
  LPTSTR lpVolumeNameBuffer,        // volume name buffer
  DWORD nVolumeNameSize,            // length of name buffer
  LPDWORD lpVolumeSerialNumber,     // volume serial number
  LPDWORD lpMaximumComponentLength, // maximum file name length
  LPDWORD lpFileSystemFlags,        // file system options
  LPTSTR lpFileSystemNameBuffer,    // file system name buffer
  DWORD nFileSystemNameSize         // length of file system name buffer
);
}
function GetLastError( ) : Integer;
external 'GetLastError@kernel32.dll stdcall';

function InitializeSetup(): Boolean;
var srcdisk, volume: String;
    ercode: Integer; sernum: LongInt;
begin
  Result := true;
  srcdisk := AddBackslash( ExtractFileDrive( ExpandConstant('{srcexe}') ) );
  volume := StringOfChar( ' ', 16 );
  if GetVolumeInformation( srcdisk, volume, 15, sernum, 0, 0, '', 0 ) = 0 then
    begin
      ercode := GetLastError();
      MsgBox( SysErrorMessage( ercode ), mbError, MB_OK );
      Result := false;
    end
  else begin
    volume := CastIntegerToString( CastStringToInteger(volume) );
    MsgBox( Format( '%s 的卷标是“%s”,序列号是 %s。', [srcdisk, volume, IntToStr(sernum)] )
      , mbInformation, MB_OK );
  end;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2015-08-16
我重复一下上面说过的意思,希望你提出具体问题是什么,要达到什么目的。不针对具体目的,而是笼统去把所有能找到的的示例脚本拿来看看,这个不是我想做的事情,请谅解。

关于你上面列出的脚本,我看了一下,意见如下:

1) 如何检测当前显示分辨率和颜色深度
脚本一点问题都没有。如果你是用 Unicode 版本的 INNO,只要把一个地方的 xxxA 改成 xxxW 就行了。而这个你已经很会做了。

2) 如何检测文件系统的类型
这个和下面的“如何获得驱动器类型”其实是一回事,代码是一样的。

3) 如何注销如果用户不是管理员
脚本没有问题,不需要修改什么。

4) 如何浏览文件
这个脚本已经没有什么意义了,因为 INNO 早就自己有标准函数 GetOpenFileName,不需要用 API。
你当然还是可以用这个脚本,只要稍微调整一下,见下面,希望举一反三。


5) 如何获得驱动器的数量和序列号 (应该是如何获得驱动器的卷标和序列号
调整后的脚本见下面,希望举一反三。


6) 如何获得驱动器类型
调整后的脚本见下面,希望举一反三。


离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-08-15
回 2楼(546242502) 的帖子
546242502:我不是将它们变成 Unicode 版本的脚本,而是随着 INNO  更新了,旧版函数好像不能用了,我不会修正[表情] (2015-08-15 11:43) 

老虎版主,你能不能抽空修正以下这些脚本,自己实现无法搞定,所以才发上来求助!
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 2 发表于: 2015-08-15
回 1楼(gnatix) 的帖子
gnatix:能不能说明具体是什么问题?为什么要修正?把 ANSI 下的脚本修改成 Unicode 版本下的脚本是毫无意义的事情,因为这样修改后的脚本拿到 ANSI 下去运行又有问题。 (2015-08-15 02:14) 

我不是将它们变成 Unicode 版本的脚本,而是随着 INNO  更新了,旧版函数好像不能用了,我不会修正
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2015-08-15
能不能说明具体是什么问题?为什么要修正?
把 ANSI 下的脚本修改成 Unicode 版本下的脚本是毫无意义的事情,因为这样修改后的脚本拿到 ANSI 下去运行又有问题。