CSDN博客

img ch21st

C++ Builder几个应用技巧

发表于2003/4/25 16:12:00  1012人阅读

在9x下直接访问硬盘


在Windows9X中,由于内存和进程的保护,直接使用INT将会引起GPFs。在很多资料上都说要在windows中直接读写硬盘的方法只有使用VxD。这并不是真的,事实上使用windows9x公开的API就可以直接对硬盘进行操作。在microsoft programmer's guide to win95中,关于Device I/O Control中就有说明如何使用VWIN32呼叫MSDOS系统服务(磁盘访问类)。定义了一下5个控制码
VWIN32_DIOC_DOS_DRIVEINFO (6) INT 21h AX=730Xh,win95 osr2与以后版本提供的FAT32文件系统的访问
VWIN32_DIOC_DOS_INT13 (4) BIOS INT13h
VWIN32_DIOC_DOS_INT25 (2) DOS INT25h
VWIN32_DIOC_DOS_INT26 (3) DOS INT26h
VWIN32_DIOC_DOS_IOCTL (1) DOS设备I/O,(int 21h,ax=4400h到4411h)
使用方法如下:
使用
CreateFile("////.//vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
打开vwin32.vxd
根据调用的功能所用到的寄存器填充以下结构体:
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
使用
DeviceIoControl(hDevice,CONTROL_CODE,&reg,sizeof(reg),&reg,sizeof(reg),
&dwBytesReturn,0);
调用MS-DOS的磁盘访问功能。
最后调用 CloseHandle(hDevice);

确定硬盘空间


在安装一些软件时,我们会看来一些安装程序会对你说你选的硬盘空间不够,这种确定硬盘空间的程序是如何做到的呢?
GetDiskFreeSpace是一个返回一个磁盘大小、划分、可用空间等信息的函数,我们可以用它来达到目的。
DWORD sectorspercluster ;
DWORD bytespersector ;
DWORD clusters ;
DWORD freeclusters ;
GetDiskFreeSpace (path.c_str (),&sectorspercluster,&bytespersector,&freeclusters,&clusters);

确定系统还有多少内存


大家都会想看看自己的内存还有多少,在一些工具中我们可以看到,如果我们自己来做要做些什么才能实现呢?
WINDOWS的API函数GlobalMemoryStatus是用来得到当前内存情况的,如果我们想实时看到内存的变化情况就要配合TIMER来完成了。我们是把提取每次内存情况和显示做成一个函数,只要在TIMER中设定一个你想要的调用周期,就可以达到目的了。下面是一个系统信息程序的一段,也就是关于内存的部分。
void TForm1::UpdateUsage ()
{
MEMORYSTATUS memory ;

memory.dwLength = sizeof (memory) ;
GlobalMemoryStatus (&memory) ;

ProgressBar1->Position = (float) memory.dwMemoryLoad ;

// Physical Memory Usage
ProgressBar2->Position = 100.0 * (memory.dwTotalPhys - memory.dwAvailPhys) /
(float) memory.dwTotalPhys ;

Label7->Caption = String ((int) (memory.dwTotalPhys / 1024)) + " K Total" ;

Label8->Caption = String ((int) (memory.dwAvailPhys / 1024))
+ " K Free" ;

// Virtual Memory Usage
ProgressBar3->Position =
100.0 * (memory.dwTotalVirtual - memory.dwAvailVirtual) /
(float) memory.dwTotalVirtual ;

Label9->Caption = String ((int) (memory.dwTotalVirtual / 1048576.0))
+ " MB Total" ;

Label10->Caption = String ((int) (memory.dwAvailVirtual / 1048576.0))
+ " MB Free" ;

// Page File Usage
ProgressBar4->Position =
100.0 * (memory.dwTotalPageFile - memory.dwAvailPageFile) /
(float) memory.dwTotalPageFile ;

Label11->Caption = String ((int) (memory.dwTotalPageFile / 1048576.0))
+ " MB Total" ;

Label12->Caption = String ((int) (memory.dwAvailPageFile / 1048576.0))
+ " MB Free" ;
}

0 0

相关博文

我的热门文章

img
取 消
img