• Delphi函数翻译成VC要注意句柄指针传递(传递Handle的时候,必须加上一个指针引用,才能消除编译错误)


    Delphi里做了魔法变化,每个变量名称本身就是指针,因为不怎么需要指针语法。我也不知道是不是因为这个原因引起的Delphi与VC对句柄的不同处理。

    这是Delphi的强行关机函数,好用,调用方式:WindowsExit(EWX_POWEROFF or EWX_FORCE)

    function WindowsExit(RebootParam: Longword): Boolean;
    var
        TTokenHd: THandle;
        TTokenPvg: TTokenPrivileges;
        cbtpPrevious: DWORD;
        rTTokenPvg: TTokenPrivileges;
        pcbtpPreviousRequired: DWORD;
        tpResult: Boolean;
    const
        SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    begin
        Result := false;
        try
            if Win32Platform = VER_PLATFORM_WIN32_NT then
            begin
                tpResult := OpenProcessToken(GetCurrentProcess(),
                    TOKEN_ADJUST_PRIVILEGES
                    or TOKEN_QUERY, TTokenHd);
                if tpResult then
                begin
                    tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,
                        TTokenPvg.Privileges[0].Luid);
                    TTokenPvg.PrivilegeCount := 1;
                    TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    cbtpPrevious := SizeOf(rTTokenPvg);
                    pcbtpPreviousRequired := 0;
                    if tpResult then
                        Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg,
                            cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired);
                end;
            end;
            Result := ExitWindowsEx(RebootParam, 0); // API
        except
        end;
    end;

    但是把这段代码翻译成VC,却在传递Handle的时候,必须加上一个指针引用,才能消除编译错误:

        HANDLE TTokenHd;
        bool tpResult = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TTokenHd); // 这里取指针
        if (tpResult) {
            TOKEN_PRIVILEGES TTokenPvg, rTTokenPvg;
            int cbtpPrevious;
            tpResult = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &TTokenPvg.Privileges[0].Luid); // ccc 取地址符(指针)应该是对最后一个元素起作用
            TTokenPvg.PrivilegeCount = 1;
            TTokenPvg.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // API 就是为了改变这个
            cbtpPrevious = sizeof(rTTokenPvg);
            DWORD pcbtpPreviousRequired = 0;
            if (tpResult) {
                AdjustTokenPrivileges(TTokenHd, false, &TTokenPvg, cbtpPrevious, &rTTokenPvg, &pcbtpPreviousRequired); // 这里三处取指针
            }
        }
        res = ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0); // API
  • 相关阅读:
    vnode之update 还是没太懂
    vnodec创建之标签
    1054 求平均值
    1053 住房空置率
    1052 卖个萌
    1051 复数乘法
    1050 螺旋矩阵
    1049 数列的片段和
    1048 数字加密
    1047 编程团体赛
  • 原文地址:https://www.cnblogs.com/findumars/p/4343126.html
Copyright © 2020-2023  润新知