沉默流星 发表于 2025-4-15 17:44:19

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

因不懂易语言,所以不知,这个问题是什么原因导致的,又该如何解决

代码如下:
<火山程序 类型 = "通常" 版本 = 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;
    #   DWORDdwProcessId;
    #   DWORDdwThreadId;
    # } 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 {
    #   DWORDcb;
    #   LPWSTR lpReserved;
    #   LPWSTR lpDesktop;
    #   LPWSTR lpTitle;
    #   DWORDdwX;
    #   DWORDdwY;
    #   DWORDdwXSize;
    #   DWORDdwYSize;
    #   DWORDdwXCountChars;
    #   DWORDdwYCountChars;
    #   DWORDdwFillAttribute;
    #   DWORDdwFlags;
    #   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

Xelloss0618 发表于 2025-4-15 23:37:56

直接用官方的 运行控制台程序
页: [1]
查看完整版本: 移植了个易语言源码不知问题出现在哪了