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

 

posted @ 2015-03-16 22:26  findumars  Views(432)  Comments(0Edit  收藏  举报