Delphi 핸들과 VC 핸들의 다른 처리

5515 단어 Delphi
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

좋은 웹페이지 즐겨찾기