Progress ABL中实现Java readLine()功能的方案及代码问题解决
在Progress ABL中实现类似Java
System.console().readLine() 的控制台输入功能 首先需要明确:Progress ABL原生支持控制台输入读取,无需调用Win32 API即可实现类似Java readLine()的功能。如果确实需要通过Win32 API实现,也需要修正你当前代码中的API使用错误。
一、原生Progress ABL实现(推荐)
这是最简单直接的方案,不需要依赖外部API:
DEFINE VARIABLE cUserInput AS CHARACTER NO-UNDO FORMAT "X(256)". /* 提示用户输入 */ MESSAGE "Enter value: " VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. /* 读取一行输入 */ PROMPT-FOR cUserInput WITH FRAME inputFrame NO-LABELS. /* 或者更简洁的直接读取方式 */ INPUT FROM CONSOLE. READ cUserInput. INPUT CLOSE. /* 输出结果 */ MESSAGE "You entered: " cUserInput VIEW-AS ALERT-BOX INFORMATION.
二、修复Win32 API调用的代码
你当前代码的核心问题是误用了ReadConsoleInputA API——这个函数用于读取控制台输入事件(如按键、鼠标操作),而非直接读取字符。正确的API应该是ReadConsoleA,它专门用于读取控制台的字符输入。
修正后的完整代码:
BLOCK-LEVEL ON ERROR UNDO, THROW. SESSION:ERROR-STACK-TRACE = TRUE. /* 声明正确的Win32 API:ReadConsoleA 用于读取控制台字符输入 */ PROCEDURE ReadConsoleA EXTERNAL "kernel32.dll": DEF INPUT PARAM hConsoleInput AS LONG. DEF OUTPUT PARAM lpBuffer AS CHAR. DEF INPUT PARAM nNumberOfCharsToRead AS LONG. DEF OUTPUT PARAM lpNumberOfCharsRead AS LONG. DEF INPUT PARAM lpReserved AS LONG. DEF RETURN PARAM returnValue AS LONG. END. PROCEDURE GetStdHandle EXTERNAL "kernel32.dll": DEF INPUT PARAM nStdHandle AS LONG. DEF RETURN PARAM hHandle AS LONG. END. DEF VAR hStdin AS INT NO-UNDO. DEF VAR cInputBuffer AS CHAR NO-UNDO FORMAT "X(256)". DEF VAR iCharsRead AS INT NO-UNDO. DEF VAR iCharsToRead AS INT NO-UNDO INITIAL 255. /* 获取标准输入句柄(-10代表标准输入) */ hStdin = RUN GetStdHandle(INPUT -10). MESSAGE "Enter value (type 'quit' to exit): " VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. DO WHILE TRUE: ASSIGN cInputBuffer = "" iCharsRead = 0. /* 读取控制台输入 */ RUN ReadConsoleA( INPUT hStdin, OUTPUT cInputBuffer, INPUT iCharsToRead, OUTPUT iCharsRead, INPUT 0, OUTPUT RETURN VALUE ). /* 移除输入末尾的回车换行符(ReadConsoleA会读取这些控制字符) */ cInputBuffer = TRIM(cInputBuffer, CHR(10) + CHR(13)). /* 退出条件 */ IF cInputBuffer = "quit" THEN LEAVE. /* 输出读取到的内容 */ IF iCharsRead > 0 THEN MESSAGE "You entered: '" cInputBuffer "'" SKIP. END. MESSAGE "Program exited." VIEW-AS ALERT-BOX INFORMATION.
关键修正点:
- 替换API函数:用
ReadConsoleA替代ReadConsoleInputA,前者是专门读取控制台字符的API,符合你的需求。 - 修正参数定义:严格匹配
ReadConsoleA的官方参数类型,避免类型不匹配导致的读取失败。 - 处理控制字符:
ReadConsoleA会把用户输入的回车(CHR(13))和换行(CHR(10))一并读取,需要用TRIM移除这些无效字符。 - 移除错误逻辑:删除了无效的
ReadConsoleInput函数,直接处理读取到的输入缓冲区内容。
内容的提问来源于stack exchange,提问作者W0lfw00ds
相关产品推荐
相关产品推荐

