jackhkyin 2022-10-22 21:25 采纳率: 83.3%
浏览 190
已结题

请教C++实现Windows API调用方法

Windows有个功能叫 磁盘配额 ,可以设置账户使用磁盘空间的容量限制。我需要一个可以查询指定账户磁盘配额的实现
Windows相关API是 IDiskQuotaUser::GetQuotaInformation 跟GetDisk/GetDrive/GetLogical/之类的函数不一样,我目前还不会调用这种API实现一些功能,MSDN上也没有示例代码。(另:这种到底是否属于Windows API ? 尽管它归类在API下)

哪位精通Windows API高人帮忙用C++实现调用,通过printf输出结果或者写成函数供主函数main调用。
附上注释,我也学习下这种API的调用方法

对应的API 网站:
https://learn.microsoft.com/zh-cn/windows/win32/api/dskquota/nf-dskquota-idiskquotauser-getquotainformation

Windows系统自带的 磁盘配额项 界面:

img

  • 写回答

6条回答 默认 最新

  • 四海一叶秋 2022-10-23 00:22
    关注

    参考代码:

    #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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 10月31日
  • 已采纳回答 10月23日
  • 创建了问题 10月22日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效