码迷,mamicode.com
首页 > Windows程序 > 详细

Delphi句柄与VC句柄的不同处理

时间:2015-03-17 00:33:27      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Delphi句柄与VC句柄的不同处理

标签:

原文地址:http://www.cnblogs.com/findumars/p/4343126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!