Windows有个功能叫 磁盘配额 ,可以设置账户使用磁盘空间的容量限制。我需要一个可以查询指定账户磁盘配额的实现
Windows相关API是 IDiskQuotaUser::GetQuotaInformation 跟GetDisk/GetDrive/GetLogical/之类的函数不一样,我目前还不会调用这种API实现一些功能,MSDN上也没有示例代码。(另:这种到底是否属于Windows API ? 尽管它归类在API下)
哪位精通Windows API高人帮忙用C++实现调用,通过printf输出结果或者写成函数供主函数main调用。
附上注释,我也学习下这种API的调用方法
Windows系统自带的 磁盘配额项 界面:
参考代码:
#include<stdio.h>
#include<dskquota.h>
#include <atlbase.h>
#include<windows.h>
int main()
{
HRESULT hr = CoInitialize(NULL);
if(FAILED(hr))
return -1;
CLSID clsid;
CLSIDFromProgID(OLESTR("Microsoft.DiskQuota.1"), &clsid);
CComPtr<IDiskQuotaControl> pdqc;
hr=pdqc.CoCreateInstance(clsid);
if (SUCCEEDED(hr))
{
WCHAR *path = L"C:\\";
hr=pdqc->Initialize(path, FALSE);
if (hr == S_OK)
{
WCHAR userName[] = L"BUILTIN\\Administrators";
WCHAR userDomain[512];
DWORD sizeDomain = 1024;
SID Sid[1024];
DWORD sizeSid = 1024;
SID_NAME_USE peUse;
LookupAccountNameW(NULL, userName, Sid, &sizeSid, userDomain, &sizeDomain, &peUse);
printf("请勿关闭窗口!正在查询用户的C盘配额...\n");
IDiskQuotaUser *pdqu;
hr = pdqc->FindUserSid(Sid, DISKQUOTA_USERNAME_RESOLVE_NONE, &pdqu);
//hr = pdqc->FindUserName(userName, &pdqu);//耗时较长!
pdqc->ShutdownNameResolution();
if (hr == S_OK)
{
DISKQUOTA_USER_INFORMATION dqui = { 0 };
LONG size = sizeof(dqui);
hr = pdqu->GetQuotaInformation(&dqui, size);
if (hr == S_OK)
{
if (dqui.QuotaLimit == -1)
printf("配额限制:无限制\n");
else
printf("配额限制:%lld 字节\n", dqui.QuotaLimit);
if (dqui.QuotaThreshold == -1)
printf("警告等级:无限制\n");
else
printf("警告等级:%lld 字节\n", dqui.QuotaThreshold);
printf("使用量:%lld 字节\n", dqui.QuotaUsed);
}
else
printf("获取配额信息失败!错误代码:%d\n", hr);
pdqu->Release();
}
else
printf("查找用户配额失败!错误代码:%d\n", hr);
pdqc.Release();
}
else
printf("Initialize失败!错误代码:%d\n", hr);
}
CoUninitialize();
return 0;
}
#include "DskQuota.h"
int main()
{
if(FAILED(CoInitialize(NULL)))
{
printf("COM init failed.\n");
return -1;
}
HRESULT rst;
IDiskQuotaControl *pdqc = NULL;
if(FAILED(rst = CoCreateInstance( CLSID_DiskQuotaControl, NULL, CLSCTX_SERVER,
IID_IDiskQuotaControl, (VOID**)&pdqc )))
{
printf("Can't create object. Error Code:%08lx\n",rst);
CoUninitialize();
return -1;
}
LPCWSTR cs1 = TEXT("D:\\");
if(FAILED(rst = pdqc->Initialize( cs1, TRUE ))) //以 读/写 方式访问卷标
{
printf("Init failed. Error Code:%08lx\n",rst);
pdqc->Release();
CoUninitialize();
return -1;
}
LONGLONG llLimit;
if(FAILED(rst = pdqc->GetDefaultQuotaLimit( &llLimit )))
{
printf("Get quota limit failed. Error Code:%08lx\n",rst);
}
LONGLONG pllLimit;
if(FAILED(rst = pdqc->GetDefaultQuotaThreshold( &pllLimit )))
{
printf("Get Default Quota Threshold. Error Code:%08lx\n",rst);
}
PDISKQUOTA_USER_BATCH ppBatch;
if(FAILED(rst = pdqc->CreateUserBatch( &ppBatch )))
{
printf("Create User Batch. Error Code:%08lx\n",rst);
}
//////////////////////////////////////////////////////////////
IDiskQuotaUser *pDiskQuotaUser = NULL;
if(FAILED(rst=pdqc->QueryInterface(IID_IDiskQuotaUser,(VOID**)&pDiskQuotaUser))) /*问题就出现在这里*/
{
printf("Can't query IDiskQuotaUser Interface. Error Code:%08lx\n",rst);
return -1;
}
DISKQUOTA_USER_INFORMATION dui;
HRESULT hRes = pDiskQuotaUser->GetQuotaInformation(&dui,sizeof(DISKQUOTA_USER_INFORMATION));
pDiskQuotaUser->Release();
//////////////////////////////////////////////////////////////
pdqc->Release();
CoUninitialize();
return 0;
}
严格来说这个应该不是API,而是Com接口类,大致看了一下,楼上的代码应该是对的
调用API具体步骤:
1.包含调用函数的头文件;
2.连接指定的库文件;
3.API函数前加::符号,表示全局函数.
4.在MSDN中可以找到相关API的用法。
下面是一个简单的例子:
#include stdafx.h // 这是VC自动添加的文件,没有什么用途
#include windows.h // 包含MessageBox函数声明的头文件
int main(int argc, char* argv[])
{
// 调用API函数MessageBox
int nSelect = ::MessageBox(NULL, Hello, Windows XP, Greetings, MB_OKCANCEL);
if(nSelect == IDOK)
printf( 用户选择了“确定”按钮 \n);
else
printf( 用户选择了“取消”按钮 \n);
return 0;
}
【这是个人理解,仅供参考】
另,这里特别推荐这个博友,和他的文章,期望对你有所帮助
【【C++】Windows控制台API基本使用(上)】
链接:https://blog.csdn.net/weixin_48178135/article/details/121306169?spm=1001.2014.3001.5502
【C++】Windows控制台API基本使用(下)】
链接2:https://blog.csdn.net/weixin_48178135/article/details/121715810
需要什么程序,命令行还是窗口程序呢?
这个不是API吧?朋友可以看看这个,下面是此 API 的原型:
BOOL WINAPI FillConsoleOutputCharacter(
In HANDLE hConsoleOutput, // 输出句柄
In TCHAR cCharacter, // 要填充的字符
In DWORD nLength, // 填充长度
In COORD dwWriteCoord, // 要写入的第一个位置的坐标
Out LPDWORD lpNumberOfCharsWritten // 返回实际填充的字符的数量