C++ 我仍然有这个问题:C++;获取分区样式
我是C/C++新手。这是一个练习。我真的不明白。上面的代码是我在网上复制的 我正在学习C++,所以即使代码是C,我还是想切换回C++ 我需要理解代码并输出屏幕:C++ 我仍然有这个问题:C++;获取分区样式,c++,winapi,C++,Winapi,我是C/C++新手。这是一个练习。我真的不明白。上面的代码是我在网上复制的 我正在学习C++,所以即使代码是C,我还是想切换回C++ 我需要理解代码并输出屏幕: 是MBR磁盘/驱动器吗 是GPT磁盘/驱动器吗 或者是原始磁盘/驱动器 在C/C++中检索有关硬盘分区类型的信息时遇到问题 我在Visual Studio 2013上按了F5,收到通知: 使用变量“partitions\u style”时未初始化 我还有另一个问题:我对我的硬盘使用DiskPart中的clean命令。当我运行测试时,
- 是MBR磁盘/驱动器吗
- 是GPT磁盘/驱动器吗
- 或者是原始磁盘/驱动器
#包括“windows.h”
#包括
#包括
使用名称空间std;
BOOL Get_Partition_样式(LPWSTR wszPath、PDRIVE_LAYOUT_INFORMATION_EX p_LAYOUT_INFORMATION_EX)
{
DWORD partitionsSize=sizeof(驱动器布局信息)+127*sizeof(分区信息);
p_布局_信息_EX=(p驱动_布局_信息_EX)malloc(分区);
HANDLE hDevice=无效的\u HANDLE\u值;
BOOL-bResult=FALSE;
德沃德垃圾=0;
hDevice=CreateFileW(wszPath,
0,
文件共享读取
文件共享写入,
无效的
开放式,
0,
无效);
if(hDevice==无效的句柄值)
{
返回(假);
}
bResult=设备控制(hDevice,
IOCTL\u磁盘\u获取\u驱动器\u布局\u EX,
NULL,0,
p_布局_信息_EX,partitionsSize,
&垃圾,
(重叠)空);
闭合手柄(hDevice);
返回(bResult);
}
void enum_分区()
{
对于(int i=0;i++)
{
WCHAR卷[最大路径];
wsprintf(卷,L“\\.\\PhysicalDrive%d”,i);
HANDLE h=CreateFile(卷,0,文件共享,读取,文件共享,写入,NULL,打开,0,0);
bool success=h!=无效的句柄值;
如果(!成功)
打破
wcout您将一个PDRIVE\u LAYOUT\u INFORMATION\u EX
传递给Get\u Partition\u Styles()
,但在函数中您说p\u LAYOUT\u INFORMATION\u EX=(PDRIVE\u layou INFORMATION\u EX)malloc(partitionsSize);
所以您刚刚覆盖了传入的值
由于您是通过值传递的,因此更新的版本在调用方中不可见,因此调用方中的版本永远不会设置为值。(被调用函数中的版本可能是内存泄漏,因为存在malloc,但没有空闲)
作为旁注:C还是C++?< /P>
如果你在C++中,你可以通过一个引用,但是为什么你使用Maloc?< /P>
如果您使用的是C语言,那么您可以传递一个要填充的指针(传递引用的旧版本:-)。请阅读。该代码存在内存泄漏问题。无论malloc
成功与否,您都应该将free()
放在for{}
中,因为分区样式的生命周期是for{}
,我建议将malloc
作为free()放在相同的{}
中,而不是放在函数中。此外,使用变量'partitions\u style'时没有初始化。这意味着您需要像PDRIVE\u layou INFORMATION\u EX partitions\u style=NULL;
#include "windows.h"
#include <stdio.h>
#include <iostream>
using namespace std;
BOOL Get_Partition_Styles(LPWSTR wszPath, PDRIVE_LAYOUT_INFORMATION_EX p_LAYOUT_INFORMATION_EX)
{
DWORD partitionsSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX)+127 * sizeof(PARTITION_INFORMATION_EX);
p_LAYOUT_INFORMATION_EX = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(partitionsSize);
HANDLE hDevice = INVALID_HANDLE_VALUE;
BOOL bResult = FALSE;
DWORD junk = 0;
hDevice = CreateFileW(wszPath,
0,
FILE_SHARE_READ |
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice,
IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
NULL, 0,
p_LAYOUT_INFORMATION_EX, partitionsSize,
&junk,
(LPOVERLAPPED)NULL);
CloseHandle(hDevice);
return (bResult);
}
void enum_Partitions()
{
for (int i = 0;; i++)
{
WCHAR volume[MAX_PATH];
wsprintf(volume, L"\\\\.\\PhysicalDrive%d", i);
HANDLE h = CreateFile(volume, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
bool success = h != INVALID_HANDLE_VALUE;
if (!success)
break;
wcout << endl << endl << endl << L"Disk #" << i << endl;
PDRIVE_LAYOUT_INFORMATION_EX partitions_style; // disk drive geometry structure
BOOL bResult = FALSE; // generic results flag
bResult = Get_Partition_Styles(volume, partitions_style);
if (!bResult)
{
wcout << L"Partition Style: " << partitions_style->PartitionStyle << endl;
}
else
{
wcout << L"Get_Partition_Styles failed. Error: " << GetLastError() << endl;
}
CloseHandle(h);
}
free(partitions_style);
}
int main(int argc, char* argv[])
{
enum_Partitions();
bool success_nh;
cin >> success_nh;
return 0;
}