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

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

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-08-14
用户被禁言,该主题自动屏蔽!
离线gnatix

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

发帖
332
金钱
-3060
威望
-306
只看该作者 2 发表于: 2015-08-15
用户被禁言,该主题自动屏蔽!
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-08-15
用户被禁言,该主题自动屏蔽!
离线gnatix

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

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

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

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

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

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


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


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


离线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
只看该作者 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
只看该作者 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;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 8 发表于: 2015-08-16
用户被禁言,该主题自动屏蔽!