开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1567|回复: 5
收起左侧

[火山PC求助] 从易语言转火山PC,DLL命令Process32FirstW返回始终为假不知为何..

[复制链接]
结帖率:0% (0/2)
发表于 2023-10-1 01:48:34 | 显示全部楼层 |阅读模式   四川省遂宁市
5精币
易语言转火山PC,DLL命令Process32FirstW返回始终为假不知为何..

易语言

易语言

火山PC

火山PC




  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 请在本子程序中放置易模块初始化代码
_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
_临时子程序  
变量名类 型静态数组备 注
进程ID整数型 
进程句柄整数型 
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
输出调试文本 (RunProcess (“E:\Program Files\WinRAR\WinRAR.exe”, 进程ID, 进程句柄))
子程序名返回值类型公开备 注
RunProcess逻辑型 运行进程
参数名类 型参考可空数组备 注
ProcessName文本型欲运行进程路径
进程标识符整数型PID
进程句柄整数型
变量名类 型静态数组备 注
hToken整数型 
siSTARTUPINFO 
piPROCESS_INFORMATION 
bResult逻辑型 
如果真 (ProcessName = “”)
返回 ()

' //获取进程Token
如果真 (取反 (GetTokenByName (“EXPLORER.EXE”, hToken)))
返回 ()

' //进程信息设置
si.cb = 68
si.lpDesktop = “WinSta0\Default”
si.dwFlags = #STARTF_USESHOWWINDOW
si.wShowWindow = #SW_SHOW  ' 显示窗口
' 本源码来自易语言资源网([url]www.eyuyan.la[/url])
' //创建新的进程,它将工作在新的session中
bResult = CreateProcessAsUser (hToken, ProcessName, #NULL, #NULL, #NULL, #NULL, 位或 ( #NORMAL_PRIORITY_CLASS, #CREATE_NEW_CONSOLE ), #NULL, #NULL, si, pi)
进程句柄 = pi.进程句柄
进程标识符 = pi.进程标识符
' //稍微等待处理
延时 (100)
' 本源码来自易语言资源网([url]www.eyuyan.la[/url])
' //创建完成关闭对象句柄
CloseHandle (hToken)
CloseHandle (pi.进程句柄)
CloseHandle (pi.线程句柄)
' //退出
返回 (bResult)
子程序名返回值类型公开备 注
GetTokenByName逻辑型 
参数名类 型参考可空数组备 注
lpName文本型
hToken整数型
变量名类 型静态数组备 注
hProcessSnap整数型 
bRet逻辑型 
pe32PROCESSENTRY32 
exefile文本型 
hProcess整数型 
如果真 (lpName = “”)
返回 ()
hProcessSnap = #NULL
bRet = 假
' //获取系统中正在运行的进程信息
hProcessSnap = CreateToolhelp32Snapshot ( #TH32CS_SNAPPROCESS, 0)
输出调试文本 (hProcessSnap)
如果真 (hProcessSnap = #INVALID_HANDLE_VALUE )
返回 ()

' //数据结构大小
pe32.dwSize = 296
' 输出调试文本 (Process32First (hProcessSnap, pe32))
' //遍历进程,取得lpName进程令牌
如果 (Process32First (hProcessSnap, pe32))
循环判断首 ()
' //取得当前进程信息
exefile = 到文本 (pe32.szExeFile)
' //判断是否为lpName进程
如果真 (exefile = lpName)
' //取得当前进程句柄
hProcess = OpenProcess ( #PROCESS_QUERY_INFORMATION, #NULL, pe32.th32ProcessID)
' //打开当前进程令牌
bRet = OpenProcessToken (hProcess, #TOKEN_ALL_ACCESS, hToken)
' //关闭对象句柄
CloseHandle (hProcessSnap)
返回 (bRet)

循环判断尾 (Process32Next (hProcessSnap, pe32))
bRet = 真
bRet = 假
' //关闭对象句柄
CloseHandle (hProcessSnap)
返回 (bRet)



下面为火山PC源码
<火山程序 类型 = "通常" 版本 = 1 />

包 火山.视窗 <@文档 = "category = \"集_RunProcess\"">

类 常量类 <公开 @全局类 = 真>
{
    常量 FALSE <公开 类型 = 逻辑型 值 = 假 "">
    常量 TRUE <公开 类型 = 逻辑型 值 = 真>
    常量 NULL <公开 类型 = 整数 值 = 0>
    常量 ERROR_FILE_NOT_FOUND <公开 类型 = 整数 值 = 2>
    常量 TH32CS_SNAPPROCESS <公开 类型 = 整数 值 = 2>
    常量 INVALID_HANDLE_VALUE <公开 类型 = 整数 值 = -1>
    常量 PROCESS_QUERY_INFORMATION <公开 类型 = 整数 值 = 1024>
    常量 TOKEN_ALL_ACCESS <公开 类型 = 长整数 值 = 983551>
    常量 STARTF_USESHOWWINDOW <公开 类型 = 整数 值 = 1>
    常量 CREATE_NEW_CONSOLE <公开 类型 = 整数 值 = 16>
    常量 NORMAL_PRIORITY_CLASS <公开 类型 = 短整数 值 = 32>
    常量 SW_SHOW <公开 类型 = 短整数 值 = 5>

    #
}

类 API_RunProcess_类 <公开>
{

    #

    方法 RunProcess <公开 类型 = 逻辑型 注释 = "运行进程" @禁止流程检查 = 真>
    参数 ProcessName <类型 = 文本型 注释 = "欲运行进程路径">
    参数 进程标识符 <类型 = 整数类 注释 = "PID">
    参数 进程句柄 <类型 = 整数类>
    {
        变量 hToken <类型 = 整数>
        变量 si <类型 = STARTUPINFO>
        变量 pi <类型 = PROCESS_INFORMATION>
        变量 bResult <类型 = 逻辑型>
        如果真 (ProcessName == "")
        {
            返回 (假)
        }

        // //获取进程Token

        如果真 (取反 (GetTokenByName ("EXPLORER.EXE", hToken)))
        {
            返回 (假)
        }

        // //进程信息设置
        si.cb = 68
        si.lpDesktop = "WinSta0\Default"
        si.dwFlags = 常量类.STARTF_USESHOWWINDOW
        si.wShowWindow = 常量类.SW_SHOW  // 显示窗口

        // //创建新的进程,它将工作在新的session中
        bResult = CreateProcessAsUser (hToken, ProcessName, 常量类.NULL, 常量类.NULL, 常量类.NULL, 常量类.NULL, 位或 (常量类.NORMAL_PRIORITY_CLASS, 常量类.CREATE_NEW_CONSOLE), 常量类.NULL, 常量类.NULL, si, pi)
        进程句柄.值 = pi.Process_handle
        进程标识符.值 = pi.Process_identifier
        // //稍微等待处理
        延时 (100)

        // //创建完成关闭对象句柄
        CloseHandle (hToken)
        CloseHandle (pi.Process_handle)
        CloseHandle (pi.Thread_handle)

        // //退出
        返回 (bResult)

    }

    方法 GetTokenByName <类型 = 逻辑型 @禁止流程检查 = 真>
    参数 lpName <类型 = 文本型>
    参数 hToken <类型 = 整数>
    {
        变量 hProcessSnap <类型 = 长整数>
        变量 bRet <类型 = 逻辑型>
        变量 pe32 <类型 = PROCESSENTRY32W>
        变量 exefile <类型 = 文本型>
        变量 hProcess <类型 = 长整数>
        如果真 (lpName == "")
        {
            返回 (假)
        }
        hProcessSnap = 常量类.NULL
        bRet = 假
        // //获取系统中正在运行的进程信息
        hProcessSnap = CreateToolhelp32Snapshot (常量类.TH32CS_SNAPPROCESS, 0)
        如果真 (hProcessSnap == 常量类.INVALID_HANDLE_VALUE)
        {
            返回 (假)
        }
        // //数据结构大小
        pe32.dwSize = 296
        调试输出 (Process32FirstW (hProcessSnap, pe32))
        // //遍历进程,取得lpName进程令牌
        如果 (Process32FirstW (hProcessSnap, pe32))
        {
            循环判断首 ()
            {
                // //取得当前进程信息
                exefile = 字符数组到文本 (pe32.szExeFile, 260)
                调试输出 (exefile)
                // exefile = 到文本 (pe32.szExeFile)
                // //判断是否为lpName进程
                如果真 (exefile == lpName)
                {
                    // //取得当前进程句柄
                    hProcess = OpenProcess (常量类.PROCESS_QUERY_INFORMATION, 常量类.NULL, pe32.th32ProcessID)
                    // //打开当前进程令牌
                    bRet = OpenProcessToken (hProcess, 常量类.TOKEN_ALL_ACCESS, hToken)

                    // //关闭对象句柄
                    CloseHandle (hProcessSnap)
                    返回 (bRet)

                }

            }
            循环判断尾 (Process32NextW (hProcessSnap, pe32))


            bRet = 真
        }
        否则
        {
            bRet = 假
            // //关闭对象句柄
            CloseHandle (hProcessSnap)
        }
        返回 (bRet)
    }

    方法 CreateProcessAsUser <公开 静态 类型 = 逻辑型 注释 = "建立指定用户的新进程" 返回值注释 = "CreateProcessAsUserA"
            @输出名 = "CreateProcessAsUserW" @视窗.输入 = "Advapi32.dll">
    参数 hToken <类型 = 变整数>
    参数 lpApplicationName <类型 = 文本型>
    参数 lpCommandLine <类型 = 变整数>
    参数 lpProcessAttributes <类型 = 变整数>
    参数 lpThreadAttributes <类型 = 变整数>
    参数 bInheritHandles <类型 = 变整数>
    参数 dwCreationFlags <类型 = 变整数>
    参数 lpEnvironment <类型 = 变整数>
    参数 lpCurrentDirectory <类型 = 变整数>
    参数 lpStartupInfo <类型 = STARTUPINFO>
    参数 lpProcessInformation <类型 = PROCESS_INFORMATION 注释 = "啊德瓦达">

    方法 CreateToolhelp32Snapshot <公开 静态 类型 = 变整数 返回值注释 = "CreateToolhelp32Snapshot"
            @输出名 = "CreateToolhelp32Snapshot" @视窗.输入 = "Kernel32.dll">
    参数 dwFlags <类型 = 整数 注释 = "用来指定“快照”中需要返回的对象">
    参数 th32ProcessID <类型 = 整数 注释 = "一个进程ID号,用来指定要获取哪一个进程的快照,0代表获取系统进程列表或获取当前进程快照">

    方法 OpenProcess <公开 静态 类型 = 变整数 注释 = "将句柄返回给过程对象" 返回值注释 = "OpenProcess" @输出名 = "OpenProcess"
            @视窗.输入 = "Kernel32.dll">
    参数 dwDesiredAccess <类型 = 变整数>
    参数 bInheritHandle <类型 = 变整数>
    参数 dwProcessId <类型 = 变整数>

    方法 OpenProcessToken <公开 静态 类型 = 逻辑型 注释 = "打开过程令牌对象" 返回值注释 = "OpenProcessToken"
            @输出名 = "OpenProcessToken" @视窗.输入 = "advapi32.dll">
    参数 ProcessHandle <类型 = 变整数>
    参数 DesiredAccess <类型 = 变整数>
    参数 TokenHandle <类型 = 变整数>

    方法 Process32FirstW <公开 静态 类型 = 逻辑型 @输出名 = "Process32FirstW" @视窗.输入 = "Kernel32.dll">
    参数 hSnapshot <类型 = 变整数 "">
    参数 lppe <类型 = PROCESSENTRY32W @视窗.输出参数 = 真>

    方法 Process32NextW <公开 静态 类型 = 逻辑型 @输出名 = "Process32NextW" @视窗.输入 = "Kernel32.dll">
    参数 hSnapshot <类型 = 变整数>
    参数 lppe <类型 = PROCESSENTRY32W @视窗.输出参数 = 真>

    方法 CloseHandle <公开 静态 类型 = 逻辑型 @输出名 = "CloseHandle" @视窗.输入 = "Kernel32.dll">
    参数 hObject <类型 = 变整数>

    方法 LocalSize <公开 静态 类型 = 变整数 返回值注释 = "LocalSize" @输出名 = "LocalSize" @视窗.输入 = "kernel32.dll">
    参数 参数 <类型 = 变整数>
}

#

类 SECURITY_ATTRIBUTES <注释 = "安全性结构" @视窗.结构类 = 0>
{
    变量 nLength <公开 类型 = 变整数 @输出名 = "nLength">
    变量 lpSecurityDescriptor <公开 类型 = 变整数 @输出名 = "lpSecurityDescriptor">
    变量 bInheritHandle <公开 类型 = 变整数 @输出名 = "bInheritHandle">
}

类 STARTUPINFO <注释 = "进程启动信息" @视窗.结构类 = 0>
{
    变量 cb <公开 类型 = 变整数 注释 = "NULL" @输出名 = "cb">
    变量 lpReserved <公开 类型 = 文本型 注释 = "\"\"" @输出名 = "lpReserved">
    变量 lpDesktop <公开 类型 = 文本型 注释 = "\"\"" @输出名 = "lpDesktop">
    变量 lpTitle <公开 类型 = 文本型 注释 = "\"\"" @输出名 = "lpTitle">
    变量 dwX <公开 类型 = 变整数 注释 = "0" @输出名 = "dwX">
    变量 dwY <公开 类型 = 变整数 注释 = "0" @输出名 = "dwY">
    变量 dwXSize <公开 类型 = 变整数 注释 = "0" @输出名 = "dwXSize">
    变量 dwYSize <公开 类型 = 变整数 注释 = "0" @输出名 = "dwYSize">
    变量 dwXCountChars <公开 类型 = 变整数 注释 = "0" @输出名 = "dwXCountChars">
    变量 dwYCountChars <公开 类型 = 变整数 注释 = "0" @输出名 = "dwYCountChars">
    变量 dwFillAttribute <公开 类型 = 变整数 注释 = "0" @输出名 = "dwFillAttribute">
    变量 dwFlags <公开 类型 = 变整数 注释 = "STARTF_USESHOWWINDOW" @输出名 = "dwFlags">
    变量 wShowWindow <公开 类型 = 短整数 注释 = "0" @输出名 = "wShowWindow">
    变量 cbReserved2 <公开 类型 = 短整数 注释 = "0" @输出名 = "cbReserved2">
    变量 lpReserved2 <公开 类型 = 变整数 注释 = "NULL" @输出名 = "lpReserved2">
    变量 hStdInput <公开 类型 = 变整数 注释 = "0" @输出名 = "hStdInput">
    变量 hStdOutput <公开 类型 = 变整数 注释 = "0" @输出名 = "hStdOutput">
    变量 hStdError <公开 类型 = 变整数 注释 = "0" @输出名 = "hStdError">
}

类 PROCESS_INFORMATION <注释 = "进程标识" @视窗.结构类 = 0>
{
    变量 Process_handle <公开 类型 = 整数 注释 = "\"进程句柄\"" @输出名 = "Process_handle">
    变量 Thread_handle <公开 类型 = 整数 注释 = "\"线程句柄\"" @输出名 = "Thread_handle">
    变量 Process_identifier <公开 类型 = 整数 注释 = "\"进程标识符\"" @输出名 = "Process_identifier">
    变量 Thread_identifier <公开 类型 = 整数 注释 = "\"线程标识符\"" @输出名 = "Thread_identifier">
}

类 PROCESSENTRY32W <公开 @视窗.结构类 = 0>
{
    变量 dwSize <公开 类型 = 整数>
    变量 cntUsage <公开 类型 = 整数>
    变量 th32ProcessID <公开 类型 = 整数>
    变量 th32DefaultHeapID <公开 类型 = 变整数>
    变量 th32ModuleID <公开 类型 = 整数>
    变量 cntThreads <公开 类型 = 整数>
    变量 th32ParentProcessID <公开 类型 = 整数>
    变量 pcPriClassBase <公开 类型 = 整数>
    变量 dwFlags <公开 类型 = 整数>
    变量 szExeFile <公开 类型 = "字符 [260]">
}




API运行进程_2022-04-07 18.11.e

9.42 KB, 下载次数: 0

API_RunProcess.rar

2.71 KB, 下载次数: 1


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 资源分享区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 帖子申请荣誉值,获得 3点 荣誉值,荣誉值可兑换终身vip用户组哦。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
发表于 2023-10-1 01:56:59 | 显示全部楼层   广东省深圳市
66666666666666666666666666666
回复

使用道具 举报

结帖率:100% (3/3)

签到天数: 2 天

发表于 2023-10-1 02:18:59 | 显示全部楼层   广东省汕头市
首先能确定一点,你指针或者句柄 都用错数据类型  是用变整数 而不是长整数  长整数只支持64   变整数支持32和 64

补充内容 (2023-10-1 02:19):
其次64和32位,结构体的长度也不一样。 需要用sizeof
回复

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2023-10-1 14:36:51 | 显示全部楼层   四川省遂宁市
道易有道 发表于 2023-10-1 02:18
首先能确定一点,你指针或者句柄 都用错数据类型  是用变整数 而不是长整数  长整数只支持64   变整数支持3 ...

其次64和32位,结构体的长度也不一样。 需要用sizeof 可以给出具体代码吗
回复

使用道具 举报

结帖率:100% (3/3)

签到天数: 2 天

发表于 2023-10-1 16:24:59 | 显示全部楼层   广东省汕头市
heyu852521 发表于 2023-10-1 14:36
其次64和32位,结构体的长度也不一样。 需要用sizeof 可以给出具体代码吗

取结构数据尺寸
回复

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2023-10-2 00:28:41 | 显示全部楼层   四川省遂宁市

可以帮我修改调试一下代码吗 API_RunProcess.rar (2.78 KB, 下载次数: 0)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表