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

被折叠的 条评论
为什么被折叠?



