|
因不懂易语言,所以不知,这个问题是什么原因导致的,又该如何解决
代码如下:
- <火山程序 类型 = "通常" 版本 = 1 />
- 包 火山.程序
- 类 启动类 <公开 基础类 = 窗口程序类>
- {
- 变量 主窗口对象 <类型 = 我的主窗口>
- 方法 启动方法 <公开 类型 = 整数>
- {
- 主窗口对象.创建主窗口 ()
- 返回 (1)
- }
- }
- # ===
- 类 我的主窗口 <基础类 = 窗口 注释 = "样例主窗口" @视窗.布局 = "client_size = "500, 300"" 标题 = "我的主窗口">
- {
- 变量 按钮1 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = "183, 154, 77, 38"" 标题 = "按钮1">
- #
- 方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
- 参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
- 参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
- {
- 变量 a <类型 = 文本型>
- 变量 b <类型 = 变整数>
- 中文控制台.取控制台程序文本信息 ("hhahah", , 到字节集 (a), b)
- 返回 (0)
- }
- }
- 类 中文控制台 <公开>
- {
- 方法 取控制台程序文本信息 <公开 静态 注释 = "取出一个控制台程序的返回信息">
- 参数 执行程序名 <类型 = 文本型 注释 = "欲执行的程序">
- 参数 命令行 <类型 = 文本型 注释 = "欲执行的参数" @默认值 = "">
- 参数 内容数据 <类型 = 字节集类 @默认值 = 空对象>
- 参数 回调函数 <类型 = 变整数 注释 = "参数一为取出当前处理的信息" @默认值 = 0>
- {
- 变量 SECURITY_ATTRIBUTES <类型 = SECURITY_ATTRIBUTES>
- 变量 STARTUPINFO <类型 = STARTUPINFO>
- 变量 PROCESS_INFORMATION <类型 = PROCESS_INFORMATION>
- 变量 hRead <类型 = 整数>
- 变量 hWrite <类型 = 整数>
- 变量 临时字节集 <类型 = 字节集类>
- 变量 临时文本 <类型 = 文本型>
- 变量 长度 <类型 = 整数>
- 变量 EXIT <类型 = 整数>
- 变量 文件 <类型 = 文本型>
- 变量 临时全部文本 <类型 = 文本型>
- 如果 (文件是否存在 (执行程序名) == 假)
- {
- 写到文件 (执行程序名, 内容数据)
- }
- 否则
- {
- 如果 (内容数据.是否为空对象 ())
- {
- 写到文件 (执行程序名, 内容数据)
- }
- }
- SECURITY_ATTRIBUTES.nLength = 12
- SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
- SECURITY_ATTRIBUTES.bInheritHandle = 真
- CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)
- STARTUPINFO.cb = 68
- STARTUPINFO.dwFlags = 位或 (1, 256)
- STARTUPINFO.wShowWindow = 0
- STARTUPINFO.hStdOutput = hWrite
- STARTUPINFO.hStdError = hWrite
- // CreateProcess (执行程序名, 命令行, 0, 0, 真, 0, 0, 取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假)), STARTUPINFO, PROCESS_INFORMATION)
- CreateProcess (取文本指针 (执行程序名), 取文本指针 (命令行), 0, 0, 真, 0, 0, 取文本指针 (取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假))), STARTUPINFO, PROCESS_INFORMATION)
- CloseHandle (hWrite)
- 判断循环 (长度 != -1)
- {
- PeekNamedPipe (hRead, 0, 0, 0, 长度, 0)
- 如果 (长度 != 0)
- {
- 临时字节集 = 取空白字节集 (260)
- ReadFile (hRead, 临时字节集, 260, 长度, 0)
- 临时字节集 = 取字节集左边 (临时字节集, 长度)
- // 临时字节集 = 字节集类.子字节集替换 (临时字节集, 创建字节集 (10), 创建字节集 (13, 10))
- 子字节集替换 (临时字节集, 创建字节集 (10), 创建字节集 (13, 10), , )
- 临时文本 = 临时字节集.取字节集数据 (, 文本型)
- 调用无返回值静态方法 (回调函数, 临时文本)
- // 调用子程序 (回调函数, , , 临时文本)
- }
- 否则
- {
- GetExitCodeProcess (PROCESS_INFORMATION.hProcess, EXIT)
- 如果 (EXIT != 259)
- {
- CloseHandle (hRead)
- 跳出循环
- }
- }
- 处理事件 ()
- }
- }
- 方法 CreateProcess <公开 静态 类型 = 逻辑型 注释 = "好了,看完上面的参数说明,这里我们改一个基本可用的版本出来" 折叠 @输出名 = "CreateProcessW"
- @视窗.输入 = "Kernel32.dll">
- 参数 lpApplicationName <类型 = 变整数 注释 = "提供应用程序名称(路径可空),本参数可空,在下一个参数里填写." @默认值 = 0>
- 参数 lpCommandLine <类型 = 变整数 注释 = "提供命令行(可空),如果上一个参数为空,也可以在这个参数前面加上程序名称," 注释 = "将第一个空格之前的文本视为程序名称"
- @默认值 = 0>
- 参数 lpProcessAttributes <类型 = 变整数 注释 = "进程的安全属性,决定当前创建的进程句柄是否允许被继承" @默认值 = 0>
- 参数 lpThreadAttributes <类型 = 变整数 注释 = "线程的安全属性,决定当前创建的线程句柄是否允许被继承" @默认值 = 0>
- 参数 bInheritHandles <类型 = 逻辑型 注释 = "是否允许子进程可以继承父进程的句柄表" @默认值 = 假>
- 参数 dwCreationFlags <类型 = 整数 注释 = "进程的创建标志" @默认值 = 0>
- 参数 lpEnvironment <类型 = 变整数 注释 = "进程的环境块,为0表示继承父进程的环境块" @默认值 = 0>
- 参数 lpCurrentDirectory <类型 = 变整数 注释 = "进程的当前目录,请提供完整路径" @默认值 = 0>
- 参数 lpStartupInfo <类型 = STARTUPINFO 注释 = "进程的扩展启动信息,为STARTUPINFO或STARTUPINFOEX 这两个结构体的指针">
- 参数 lpProcessInformation <类型 = PROCESS_INFORMATION 注释 = "创建成功后,在这个结构体里返回进程信息" @视窗.输出参数 = 真>
- 方法 CreatePipe <公开 静态 类型 = 整数 @输出名 = "CreatePipe" @视窗.输入 = "kernel32.dll">
- 参数 phReadPipe <类型 = 整数>
- 参数 phWritePipe <类型 = 整数>
- 参数 lpPipeAttributes <类型 = SECURITY_ATTRIBUTES @视窗.输出参数 = 真>
- 参数 nSize <类型 = 整数>
- 方法 ReadFile <公开 静态 类型 = 整数 @输出名 = "ReadFile" @视窗.输入 = "kernel32.dll">
- 参数 hFile <类型 = 整数>
- 参数 lpBuffer <类型 = 字节集类>
- 参数 nNumberOfBytesToRead <类型 = 整数>
- 参数 lpNumberOfBytesRead <类型 = 整数>
- 参数 lpOverlapped <类型 = 整数>
- 方法 WriteFile <公开 静态 类型 = 整数 @输出名 = "WriteFile" @视窗.输入 = "kernel32.dll">
- 参数 hFile <类型 = 整数>
- 参数 lpBuffer <类型 = 字节集类>
- 参数 nNumberOfBytesToRead <类型 = 整数>
- 参数 lpNumberOfBytesRead <类型 = 整数>
- 参数 lpOverlapped <类型 = 整数>
- 方法 CloseHandle <公开 静态 类型 = 整数 @输出名 = "CloseHandle" @视窗.输入 = "kernel32.dll">
- 参数 hObject <类型 = 整数>
- 方法 PeekNamedPipe <公开 静态 类型 = 整数 @输出名 = "PeekNamedPipe" @视窗.输入 = "kernel32.dll">
- 参数 hNamedPipe <类型 = 整数>
- 参数 lpBuffer <类型 = 整数>
- 参数 nBufferSize <类型 = 整数>
- 参数 lpBytesRead <类型 = 整数>
- 参数 lpTotalBytesAvail <类型 = 整数>
- 参数 lpBytesLeftThisMessage <类型 = 整数>
- 方法 GetExitCodeProcess <公开 静态 类型 = 整数 @输出名 = "GetExitCodeProcess" @视窗.输入 = "Kernel32.dll">
- 参数 hProcess <类型 = 变整数>
- 参数 lpExitCode <类型 = 整数>
- 方法 GetShortPathNameA <公开 静态 类型 = 整数 @输出名 = "GetShortPathNameA" @视窗.输入 = "kernel32.dll">
- 参数 lpszLongPath <类型 = 文本型 注释 = "指定欲获取短路径名的那个文件的名字。可以是个完整路径,或者由当前目录决定">
- 参数 lpszShortPath <类型 = 文本型 注释 = "指定一个缓冲区,用于装载文件的短路径和文件名,需先分配空间。">
- 参数 cchBuffer <类型 = 整数 注释 = "lpszShortPath缓冲区长度,请设置为260。">
- #
- }
- 类 PROCESS_INFORMATION <公开 @视窗.结构类 = 0>
- {
- 变量 hProcess <公开 类型 = 变整数 注释 = "进程句柄">
- 变量 hThread <公开 类型 = 变整数 注释 = "线程句柄">
- 变量 dwProcessId <公开 类型 = 整数 注释 = "进程ID">
- 变量 dwThreadId <公开 类型 = 整数 注释 = "线程ID">
- # typedef struct _PROCESS_INFORMATION {
- # HANDLE hProcess;
- # HANDLE hThread;
- # DWORD dwProcessId;
- # DWORD dwThreadId;
- # } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
- # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-process_information
- }
- 类 STARTUPINFO <公开 折叠 @视窗.结构类 = 0>
- {
- 变量 cb <公开 类型 = 整数 注释 = "结构体的尺寸">
- 变量 lpReserved <公开 类型 = 变整数 值 = 0 注释 = "保留字,必须为NULL">
- 变量 lpDesktop <公开 类型 = 变整数 注释 = "桌面名称">
- 变量 lpTitle <公开 类型 = 变整数 注释 = "控制台进程的标题">
- 变量 dwX <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USEPOSITION,本成员指定新建窗口的横向偏移">
- 变量 dwY <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USEPOSITION,本成员指定新建窗口的纵向偏移">
- 变量 dwXSize <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USESIZE,本成员指定新建窗口的宽度">
- 变量 dwYSize <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USESIZE,本成员指定新建窗口的高度">
- 变量 dwXCountChars <公开 类型 = 整数>
- 变量 dwYCountChars <公开 类型 = 整数>
- 变量 dwFillAttribute <公开 类型 = 整数>
- 变量 dwFlags <公开 类型 = 整数>
- 变量 wShowWindow <公开 类型 = 短整数 注释 = "窗口的显示方式">
- 变量 cbReserved2 <公开 类型 = 短整数 值 = 0 注释 = "保留字,必须为0">
- 变量 lpReserved2 <公开 类型 = 变整数 值 = 0 注释 = "保留字,必须为NULL">
- 变量 hStdInput <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准输入句柄">
- 变量 hStdOutput <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准输出句柄">
- 变量 hStdError <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准错误句柄">
- # typedef struct _STARTUPINFOW {
- # DWORD cb;
- # LPWSTR lpReserved;
- # LPWSTR lpDesktop;
- # LPWSTR lpTitle;
- # DWORD dwX;
- # DWORD dwY;
- # DWORD dwXSize;
- # DWORD dwYSize;
- # DWORD dwXCountChars;
- # DWORD dwYCountChars;
- # DWORD dwFillAttribute;
- # DWORD dwFlags;
- # WORD wShowWindow;
- # WORD cbReserved2;
- # LPBYTE lpReserved2;
- # HANDLE hStdInput;
- # HANDLE hStdOutput;
- # HANDLE hStdError;
- # } STARTUPINFOW, *LPSTARTUPINFOW;
- # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfow
- }
- 类 SECURITY_ATTRIBUTES <公开 @视窗.结构类 = 0>
- {
- 变量 nLength <公开 类型 = 整数>
- 变量 lpSecurityDescriptor <公开 类型 = 整数>
- 变量 bInheritHandle <公开 类型 = 逻辑型>
- 变量 ""
- }
复制代码 代码中,这句代码会报错
- CreateProcess (取文本指针 (执行程序名), 取文本指针 (命令行), 0, 0, 真, 0, 0, 取文本指针 (取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假))), STARTUPINFO, PROCESS_INFORMATION)
复制代码 报错如下:
- 正在启动被调试程序
- 运行时校验失败("D:\Program Files\vol_dev\win_android_chs_person\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\_vol_str_impl.cpp", 1542): npCount >= 0
复制代码
|
|