递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 344|回复: 1
打印 上一主题 下一主题

[其它] 移植了个易语言源码不知问题出现在哪了

[复制链接]

230

主题

1722

帖子

7106

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
7106
QQ
跳转到指定楼层
楼主
发表于 2025-4-15 17:44:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因不懂易语言,所以不知,这个问题是什么原因导致的,又该如何解决

代码如下:
  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 包 火山.程序

  3. 类 启动类 <公开 基础类 = 窗口程序类>
  4. {
  5.     变量 主窗口对象 <类型 = 我的主窗口>

  6.     方法 启动方法 <公开 类型 = 整数>
  7.     {
  8.         主窗口对象.创建主窗口 ()
  9.         返回 (1)
  10.     }
  11. }

  12. # ===

  13. 类 我的主窗口 <基础类 = 窗口 注释 = "样例主窗口" @视窗.布局 = "client_size = "500, 300"" 标题 = "我的主窗口">
  14. {
  15.     变量 按钮1 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = "183, 154, 77, 38"" 标题 = "按钮1">

  16.     #

  17.     方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
  18.     参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
  19.     参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
  20.     {
  21.         变量 a <类型 = 文本型>
  22.         变量 b <类型 = 变整数>

  23.         中文控制台.取控制台程序文本信息 ("hhahah", , 到字节集 (a), b)

  24.         返回 (0)
  25.     }
  26. }

  27. 类 中文控制台 <公开>
  28. {
  29.     方法 取控制台程序文本信息 <公开 静态 注释 = "取出一个控制台程序的返回信息">
  30.     参数 执行程序名 <类型 = 文本型 注释 = "欲执行的程序">
  31.     参数 命令行 <类型 = 文本型 注释 = "欲执行的参数" @默认值 = "">
  32.     参数 内容数据 <类型 = 字节集类 @默认值 = 空对象>
  33.     参数 回调函数 <类型 = 变整数 注释 = "参数一为取出当前处理的信息" @默认值 = 0>
  34.     {
  35.         变量 SECURITY_ATTRIBUTES <类型 = SECURITY_ATTRIBUTES>
  36.         变量 STARTUPINFO <类型 = STARTUPINFO>
  37.         变量 PROCESS_INFORMATION <类型 = PROCESS_INFORMATION>
  38.         变量 hRead <类型 = 整数>
  39.         变量 hWrite <类型 = 整数>
  40.         变量 临时字节集 <类型 = 字节集类>
  41.         变量 临时文本 <类型 = 文本型>
  42.         变量 长度 <类型 = 整数>
  43.         变量 EXIT <类型 = 整数>
  44.         变量 文件 <类型 = 文本型>
  45.         变量 临时全部文本 <类型 = 文本型>
  46.         如果 (文件是否存在 (执行程序名) == 假)
  47.         {
  48.             写到文件 (执行程序名, 内容数据)
  49.         }
  50.         否则
  51.         {
  52.             如果 (内容数据.是否为空对象 ())
  53.             {
  54.                 写到文件 (执行程序名, 内容数据)

  55.             }

  56.         }
  57.         SECURITY_ATTRIBUTES.nLength = 12
  58.         SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
  59.         SECURITY_ATTRIBUTES.bInheritHandle = 真
  60.         CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)
  61.         STARTUPINFO.cb = 68
  62.         STARTUPINFO.dwFlags = 位或 (1, 256)
  63.         STARTUPINFO.wShowWindow = 0
  64.         STARTUPINFO.hStdOutput = hWrite
  65.         STARTUPINFO.hStdError = hWrite
  66.         // CreateProcess (执行程序名, 命令行, 0, 0, 真, 0, 0, 取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假)), STARTUPINFO, PROCESS_INFORMATION)
  67.         CreateProcess (取文本指针 (执行程序名), 取文本指针 (命令行), 0, 0, 真, 0, 0, 取文本指针 (取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假))), STARTUPINFO, PROCESS_INFORMATION)
  68.         CloseHandle (hWrite)
  69.         判断循环 (长度 != -1)
  70.         {
  71.             PeekNamedPipe (hRead, 0, 0, 0, 长度, 0)
  72.             如果 (长度 != 0)
  73.             {
  74.                 临时字节集 = 取空白字节集 (260)
  75.                 ReadFile (hRead, 临时字节集, 260, 长度, 0)
  76.                 临时字节集 = 取字节集左边 (临时字节集, 长度)

  77.                 // 临时字节集 = 字节集类.子字节集替换 (临时字节集, 创建字节集 (10), 创建字节集 (13, 10))
  78.                 子字节集替换 (临时字节集, 创建字节集 (10), 创建字节集 (13, 10), , )
  79.                 临时文本 = 临时字节集.取字节集数据 (, 文本型)
  80.                 调用无返回值静态方法 (回调函数, 临时文本)

  81.                 // 调用子程序 (回调函数, , , 临时文本)
  82.             }
  83.             否则
  84.             {
  85.                 GetExitCodeProcess (PROCESS_INFORMATION.hProcess, EXIT)
  86.                 如果 (EXIT != 259)
  87.                 {
  88.                     CloseHandle (hRead)
  89.                     跳出循环
  90.                 }
  91.             }
  92.             处理事件 ()

  93.         }


  94.     }

  95.     方法 CreateProcess <公开 静态 类型 = 逻辑型 注释 = "好了,看完上面的参数说明,这里我们改一个基本可用的版本出来" 折叠 @输出名 = "CreateProcessW"
  96.             @视窗.输入 = "Kernel32.dll">
  97.     参数 lpApplicationName <类型 = 变整数 注释 = "提供应用程序名称(路径可空),本参数可空,在下一个参数里填写." @默认值 = 0>
  98.     参数 lpCommandLine <类型 = 变整数 注释 = "提供命令行(可空),如果上一个参数为空,也可以在这个参数前面加上程序名称," 注释 = "将第一个空格之前的文本视为程序名称"
  99.             @默认值 = 0>
  100.     参数 lpProcessAttributes <类型 = 变整数 注释 = "进程的安全属性,决定当前创建的进程句柄是否允许被继承" @默认值 = 0>
  101.     参数 lpThreadAttributes <类型 = 变整数 注释 = "线程的安全属性,决定当前创建的线程句柄是否允许被继承" @默认值 = 0>
  102.     参数 bInheritHandles <类型 = 逻辑型 注释 = "是否允许子进程可以继承父进程的句柄表" @默认值 = 假>
  103.     参数 dwCreationFlags <类型 = 整数 注释 = "进程的创建标志" @默认值 = 0>
  104.     参数 lpEnvironment <类型 = 变整数 注释 = "进程的环境块,为0表示继承父进程的环境块" @默认值 = 0>
  105.     参数 lpCurrentDirectory <类型 = 变整数 注释 = "进程的当前目录,请提供完整路径" @默认值 = 0>
  106.     参数 lpStartupInfo <类型 = STARTUPINFO 注释 = "进程的扩展启动信息,为STARTUPINFO或STARTUPINFOEX 这两个结构体的指针">
  107.     参数 lpProcessInformation <类型 = PROCESS_INFORMATION 注释 = "创建成功后,在这个结构体里返回进程信息" @视窗.输出参数 = 真>

  108.     方法 CreatePipe <公开 静态 类型 = 整数 @输出名 = "CreatePipe" @视窗.输入 = "kernel32.dll">
  109.     参数 phReadPipe <类型 = 整数>
  110.     参数 phWritePipe <类型 = 整数>
  111.     参数 lpPipeAttributes <类型 = SECURITY_ATTRIBUTES @视窗.输出参数 = 真>
  112.     参数 nSize <类型 = 整数>

  113.     方法 ReadFile <公开 静态 类型 = 整数 @输出名 = "ReadFile" @视窗.输入 = "kernel32.dll">
  114.     参数 hFile <类型 = 整数>
  115.     参数 lpBuffer <类型 = 字节集类>
  116.     参数 nNumberOfBytesToRead <类型 = 整数>
  117.     参数 lpNumberOfBytesRead <类型 = 整数>
  118.     参数 lpOverlapped <类型 = 整数>

  119.     方法 WriteFile <公开 静态 类型 = 整数 @输出名 = "WriteFile" @视窗.输入 = "kernel32.dll">
  120.     参数 hFile <类型 = 整数>
  121.     参数 lpBuffer <类型 = 字节集类>
  122.     参数 nNumberOfBytesToRead <类型 = 整数>
  123.     参数 lpNumberOfBytesRead <类型 = 整数>
  124.     参数 lpOverlapped <类型 = 整数>

  125.     方法 CloseHandle <公开 静态 类型 = 整数 @输出名 = "CloseHandle" @视窗.输入 = "kernel32.dll">
  126.     参数 hObject <类型 = 整数>

  127.     方法 PeekNamedPipe <公开 静态 类型 = 整数 @输出名 = "PeekNamedPipe" @视窗.输入 = "kernel32.dll">
  128.     参数 hNamedPipe <类型 = 整数>
  129.     参数 lpBuffer <类型 = 整数>
  130.     参数 nBufferSize <类型 = 整数>
  131.     参数 lpBytesRead <类型 = 整数>
  132.     参数 lpTotalBytesAvail <类型 = 整数>
  133.     参数 lpBytesLeftThisMessage <类型 = 整数>

  134.     方法 GetExitCodeProcess <公开 静态 类型 = 整数 @输出名 = "GetExitCodeProcess" @视窗.输入 = "Kernel32.dll">
  135.     参数 hProcess <类型 = 变整数>
  136.     参数 lpExitCode <类型 = 整数>

  137.     方法 GetShortPathNameA <公开 静态 类型 = 整数 @输出名 = "GetShortPathNameA" @视窗.输入 = "kernel32.dll">
  138.     参数 lpszLongPath <类型 = 文本型 注释 = "指定欲获取短路径名的那个文件的名字。可以是个完整路径,或者由当前目录决定">
  139.     参数 lpszShortPath <类型 = 文本型 注释 = "指定一个缓冲区,用于装载文件的短路径和文件名,需先分配空间。">
  140.     参数 cchBuffer <类型 = 整数 注释 = "lpszShortPath缓冲区长度,请设置为260。">

  141.     #
  142. }

  143. 类 PROCESS_INFORMATION <公开 @视窗.结构类 = 0>
  144. {
  145.     变量 hProcess <公开 类型 = 变整数 注释 = "进程句柄">
  146.     变量 hThread <公开 类型 = 变整数 注释 = "线程句柄">
  147.     变量 dwProcessId <公开 类型 = 整数 注释 = "进程ID">
  148.     变量 dwThreadId <公开 类型 = 整数 注释 = "线程ID">

  149.     # typedef struct _PROCESS_INFORMATION {
  150.     #   HANDLE hProcess;
  151.     #   HANDLE hThread;
  152.     #   DWORD  dwProcessId;
  153.     #   DWORD  dwThreadId;
  154.     # } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
  155.     # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-process_information
  156. }

  157. 类 STARTUPINFO <公开 折叠 @视窗.结构类 = 0>
  158. {
  159.     变量 cb <公开 类型 = 整数 注释 = "结构体的尺寸">
  160.     变量 lpReserved <公开 类型 = 变整数 值 = 0 注释 = "保留字,必须为NULL">
  161.     变量 lpDesktop <公开 类型 = 变整数 注释 = "桌面名称">
  162.     变量 lpTitle <公开 类型 = 变整数 注释 = "控制台进程的标题">
  163.     变量 dwX <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USEPOSITION,本成员指定新建窗口的横向偏移">
  164.     变量 dwY <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USEPOSITION,本成员指定新建窗口的纵向偏移">
  165.     变量 dwXSize <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USESIZE,本成员指定新建窗口的宽度">
  166.     变量 dwYSize <公开 类型 = 整数 注释 = "若dwFlags设置了STARTF_USESIZE,本成员指定新建窗口的高度">
  167.     变量 dwXCountChars <公开 类型 = 整数>
  168.     变量 dwYCountChars <公开 类型 = 整数>
  169.     变量 dwFillAttribute <公开 类型 = 整数>
  170.     变量 dwFlags <公开 类型 = 整数>
  171.     变量 wShowWindow <公开 类型 = 短整数 注释 = "窗口的显示方式">
  172.     变量 cbReserved2 <公开 类型 = 短整数 值 = 0 注释 = "保留字,必须为0">
  173.     变量 lpReserved2 <公开 类型 = 变整数 值 = 0 注释 = "保留字,必须为NULL">
  174.     变量 hStdInput <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准输入句柄">
  175.     变量 hStdOutput <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准输出句柄">
  176.     变量 hStdError <公开 类型 = 变整数 注释 = "若dwFlags设置了STARTF_USESTDHANDLES,本成员指定标准错误句柄">

  177.     # typedef struct _STARTUPINFOW {
  178.     #   DWORD  cb;
  179.     #   LPWSTR lpReserved;
  180.     #   LPWSTR lpDesktop;
  181.     #   LPWSTR lpTitle;
  182.     #   DWORD  dwX;
  183.     #   DWORD  dwY;
  184.     #   DWORD  dwXSize;
  185.     #   DWORD  dwYSize;
  186.     #   DWORD  dwXCountChars;
  187.     #   DWORD  dwYCountChars;
  188.     #   DWORD  dwFillAttribute;
  189.     #   DWORD  dwFlags;
  190.     #   WORD   wShowWindow;
  191.     #   WORD   cbReserved2;
  192.     #   LPBYTE lpReserved2;
  193.     #   HANDLE hStdInput;
  194.     #   HANDLE hStdOutput;
  195.     #   HANDLE hStdError;
  196.     # } STARTUPINFOW, *LPSTARTUPINFOW;
  197.     # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfow
  198. }

  199. 类 SECURITY_ATTRIBUTES <公开 @视窗.结构类 = 0>
  200. {
  201.     变量 nLength <公开 类型 = 整数>
  202.     变量 lpSecurityDescriptor <公开 类型 = 整数>
  203.     变量 bInheritHandle <公开 类型 = 逻辑型>
  204.     变量 ""
  205. }
复制代码
代码中,这句代码会报错
  1. CreateProcess (取文本指针 (执行程序名), 取文本指针 (命令行), 0, 0, 真, 0, 0, 取文本指针 (取文本左边 (执行程序名, 倒找文本 (执行程序名, "\", , 假))), STARTUPINFO, PROCESS_INFORMATION)
复制代码
报错如下:
  1. 正在启动被调试程序
  2. 运行时校验失败("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
复制代码


火山视窗封装视频教程
回复

使用道具 举报

28

主题

2194

帖子

7940

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
7940
沙发
发表于 2025-4-15 23:37:56 | 只看该作者
直接用官方的 运行控制台程序
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-4-23 18:37 , Processed in 0.088141 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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