用PB+WIN2K实现ExitWindowsEx的, 请进来接分.

incats 2003-10-10 09:39:06
模拟MSDN自带的例子,写了一小段关机的代码, 但GetCurrentProcess()总是返回-1, GetLastError()显示拒绝访问.
网上搜了一圈, 代码内容大同小异, 百思不得其解, 那些把代码抄来抄去发表的人, 真得测试过么? 代码如下:

long hdlProcessHandle
long hdlTokenHandle
long lBufferNeeded
luid tmpLuid
TOKEN_PRIVILEGES tkp
TOKEN_PRIVILEGES tkpNewButIgnored

constant long SE_PRIVILEGE_ENABLED = 2
Constant long TOKEN_ADJUST_PRIVILEGES GetC = 32
Constant long TOKEN_QUERY = 8

inv_errsrv.SetLastError(0)
hdlProcessHandle = GetCurrentProcess()
MessageBox("GetCurrentProcess " + string(hdlProcessHandle), inv_errsrv.of_GetLastError(inv_errsrv.GetLastError()))

OpenProcessToken (hdlProcessHandle, 40, hdlTokenHandle)
MessageBox("OpenProcessToken", inv_errsrv.of_GetLastError(inv_errsrv.GetLastError()))

LookupPrivilegeValue ("", "SeShutdownPrivilege", tmpLuid)
MessageBox("LookupPrivilegeValue", inv_errsrv.of_GetLastError(inv_errsrv.GetLastError()))

tkp.PrivilegeCount = 1 // One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED

AdjustTokenPrivileges (hdlTokenHandle, 0, tkp, 16, tkpNewButIgnored, lBufferNeeded)
MessageBox("AdjustTokenPrivileges", inv_errsrv.of_GetLastError(inv_errsrv.GetLastError()))

ExitWindowsEx (EWX_SHUTDOWN, 0)
...全文
67 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkzhou 2003-10-11
  • 打赏
  • 举报
回复
请问哪里下的呀 我也想下来看看 学习!!
或者楼主能不能把上面详细代码给我 hkzhoucqu@2911.net
万分感谢!!
hkzhou 2003-10-11
  • 打赏
  • 举报
回复
佩服!!!!!!!!
ahuanghp 2003-10-10
  • 打赏
  • 举报
回复
先定义API函数
Function integer ExitWindowsEx(uint uFlags, long dwReserved) Library "user32.dll"

再直接运行
ExitWindowsEx (4, 0)
就行了.
************************************************
uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起)
EWX_FORCE 强迫中止没有响应的进程
EWX_LOGOFF 中止进程,然后注销
EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以)
EWX_REBOOT 重新引导系统
EWX_SHUTDOWN 关闭系统
Private Const EWX_LogOff As Long = 0
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_REBOOT As Long = 2
Private Const EWX_FORCE As Long = 4
Private Const EWX_POWEROFF As Long = 8
runsoft 2003-10-10
  • 打赏
  • 举报
回复
坦克,多把精力放在 分析上,代码嘛,要用的时候就COPY,呵呵。
incats 2003-10-10
  • 打赏
  • 举报
回复
解决了.

变量定义成ulong, 就可以了. 但发现执行代码后, 其它程序都应声关了, 唯独PB这个调用程序不关, 停滞着, 以至于整个系统都不关, 显得代码没起作用一样.
有知道什么原因的么? 我的解决办法是;

POST halt close
ExitWindowsEx(...)

谢 jdsnhan(柳荫凉) : 我的代码里需要这一块内容, 倒被你抬到一个高的境界了, 呵呵. 谢谢.
jdsnhan 2003-10-10
  • 打赏
  • 举报
回复
佩服坦克求真求实的精神,我没用过,也没试过。帮你up。

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧