inno setup 判断磁盘类型 不允许程序安装在U盘上

博客作者指出,在Pascal中调用GetDriveType函数返回值不准确的问题,实际上是因为没有正确使用Ansi版本的API。通过对比C++的正确调用,发现使用Ansi版本的GetDriveTypeA可以得到准确结果。代码示例展示了如何修正这个问题,确保在判断驱动器类型时获得正确的返回值。

有的博主说这个Pascal里调用GetDriveType返回值不准确,我也遇到了。但是,并不是不准确,而是没有正确调用。正确调用应该使用Ansi版本的字符串参数和API对应的窄字符版本。

为何我知道呢?因为我们的程序运行的时候C++也会判断一次,C++调用的也是这个函数,就很准确,不管是宽字符版本还是窄字符版本都没问题。

所以我确定是Pascal调用Windows API的时候出问题了。 

function GetDriveType(lpRootPathName: AnsiString): Integer;
  external 'GetDriveTypeA@kernel32.dll stdcall';// 注意这里用的是A版本,参数也是Ansi版本
 
//#define DRIVE_UNKNOWN     0
//#define DRIVE_NO_ROOT_DIR 1
//#define DRIVE_REMOVABLE   2
//#define DRIVE_FIXED       3  硬盘
//#define DRIVE_REMOTE      4
//#define DRIVE_CDROM       5
//#define DRIVE_RAMDISK     6
  
function NextButtonClick(PageID: Integer): Boolean;
var
  driveType : Integer;
  dir : AnsiString;
begin
    if PageID = wpSelectDir then
	begin
	  dir := ExpandConstant('{app}');
	  dir := Copy(dir, 1, 2)+'/';//  C:/
	  driveType := GetDriveType(dir);
	  //MsgBox(dir, mbConfirmation, MB_OK);
	  //MsgBox(IntToStr(driveType), mbConfirmation, MB_OK);
	  if (driveType = 2) or (driveType = 4) then 
	  begin
	    MsgBox(ExpandConstant('{cm:deviceTypeFixed}'), mbConfirmation, MB_OK);
		result := False;
	  end else begin
	    result := True;
	  end;
	end	else begin
      result := True;
	end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值