Delphi函数翻译成VC要注意句柄指针传递(传递Handle的时候,必须加上一个指针引用,才能消除编译错误)
2015-03-16 22:26
525 查看
Delphi里做了魔法变化,每个变量名称本身就是指针,因为不怎么需要指针语法。我也不知道是不是因为这个原因引起的Delphi与VC对句柄的不同处理。
这是Delphi的强行关机函数,好用,调用方式:WindowsExit(EWX_POWEROFF or EWX_FORCE)
但是把这段代码翻译成VC,却在传递Handle的时候,必须加上一个指针引用,才能消除编译错误:
这是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动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- C++ 函数参数是引用和指针的时候的一些注意点。
- linux一个c文件要引用另一个c文件中的函数编译的时候,应该怎么编译?
- 函数参数用指针或引用传递时发现的一个小问题
- delphi 编写的activex控件编译的时候必须加上版本信息
- 再开一篇关于C++程序设计基核心之一:引用,指针,符号优先级,函数参数传递
- C++指针作为函数的参数进行传递时需要注意的一些问题
- 无法把指针变量本身传递给一个函数
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- 【Delphi7】 解决“程序第一次可以正常编译,但再次编译的时候会报错,必须重新打开Delphi”的问题
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判
- ibatis中使用sqlMap元素把配置写到多个文件中的时候一个注意点,运行无错误,junit报错.
- 值传递-引用传递-指针传递-函数调用时指针参数的传递 指针和引用的区别
- C++的三种传递参数到函数的方法:按值传递,用引用参数按引用传递,用指针参数按引用传递
- C函数常见错误:函数返回指向栈内存的指针或引用
- 关于二级指针的使用测试小例子,仅供测试--参数传递的时候用指针最好,因为压栈的时候指针,只是压入一个地址的值,最多4个字节(32位机上),提供的3个测试例子,基于VC6.0的环境。
- vc编译错误:不能解析某些函数的解决方法
- C函数参数传递之指针传递要注意的事项
- C++指针作为函数的参数进行传递时注意的问题