递归火山软件开发平台
标题:
移植了个易语言源码不知问题出现在哪了
[打印本页]
作者:
沉默流星
时间:
2025-4-15 17:44
标题:
移植了个易语言源码不知问题出现在哪了
因不懂易语言,所以不知,这个问题是什么原因导致的,又该如何解决
代码如下:
<火山程序 类型 = "通常" 版本 = 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
复制代码
作者:
Xelloss0618
时间:
2025-4-15 23:37
直接用官方的 运行控制台程序
欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/)
Powered by Discuz! X3.4