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[].Luid);
TTokenPvg.PrivilegeCount := ;
TTokenPvg.Privileges[].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg);
pcbtpPreviousRequired := ;
if tpResult then
Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg,
cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired);
end;
end;
Result := ExitWindowsEx(RebootParam, ); // 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[].Luid); // ccc 取地址符(指针)应该是对最后一个元素起作用
TTokenPvg.PrivilegeCount = ;
TTokenPvg.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; // API 就是为了改变这个
cbtpPrevious = sizeof(rTTokenPvg);
DWORD pcbtpPreviousRequired = ;
if (tpResult) {
AdjustTokenPrivileges(TTokenHd, false, &TTokenPvg, cbtpPrevious, &rTTokenPvg, &pcbtpPreviousRequired); // 这里三处取指针
}
}
res = ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, ); // API

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

  1. DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)

    函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...

  2. SQL函数:用于将小写的数值翻译成大写的字符串

    --功能:  用于将小写的数值翻译成大写的字符串(支持到分,即小数点后两位)       --入口参数:@decNum------数字型变量    --返回:字符串    --举例:select db ...

  3. 机器指令翻译成 JavaScript —— No.3 流程分割

    上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上.而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造. 当初之所以选择翻译,而不是模拟,就是出于性能考 ...

  4. 机器指令翻译成 JavaScript —— No.5 指令变化

    上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...

  5. 机器指令翻译成 JavaScript —— No.7 过渡语言

    上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...

  6. 机器指令翻译成 JavaScript —— 终极目标

    上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...

  7. 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样

    去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个问题:能不能把某 ...

  8. 【Java】 剑指offer(46) 把数字翻译成字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...

  9. 《剑指offer》第四十六题(把数字翻译成字符串)

    // 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成&qu ...

随机推荐

  1. sass最佳实践

    sass 变量 可以实现统一的布局,比如统一的内边距,统一的外边距,统一的颜色,统一的字号. 嵌套 可以根据组件的嵌套方式来嵌套css代码,方便收缩,查找.代码结构非常清晰,有利于以组件的方式开发 混 ...

  2. Adapter模式

    Adapter模式主要用于将一个类的接口转换为另外一个接口,通常情况下再不改变原有体系的条件下应对新的需求变化,通过引入新的适配器类来完成对既存体系的扩展和改造.实现方式主要包括: 1.类的Adapt ...

  3. 为oracle中的表格增加列和删除列

    http://blog.csdn.net/rainharder/article/details/6663458 alter table 表名 drop column 列名eg:alter table ...

  4. JSONP VS CORS

    What is JSONP ? http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about What is CORS? htt ...

  5. libnet发包例子(tcp udp arp广播)

    #include <libnet.h> int main() { libnet_t *handle; /* Libnet句柄 */ int packet_size; /* 构造的数据包大小 ...

  6. 【SQLite】使用replace替换字段中的字符

    使用replace替换字段中的字符 如:替换production表中的specification字段中的两个空格为一个空格: update production set specification = ...

  7. html5 全屏滚动活动页学习

    先看几个具体的实例: 1.腾讯娱乐:http://ent.qq.com/zt2014/qqent/h5.htm?from=groupmessage&isappinstalled=0 2.苏宁互 ...

  8. Oracle中对象权限与系统权限revoke

    实验: 1.以sys登陆,创建用户test1, test2: 2.授予test1系统权限(带admin option)-connect,授予test1对象权限(带grant option)-selec ...

  9. TCO 2014 Round 1C 概率DP

    TCO round 1C的 250 和500 的题目都太脑残了,不说了. TCO round 1C 950 一个棋子,每次等概率的向左向右移动,然后走n步之后,期望cover的区域大小?求cover, ...

  10. struts2与velocity的整合有两种方式

    1.以struts2为主.struts2内置了对velocity的支持,只要在<result name="success"?type="velocity" ...