中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-09-14 23:47
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » DOS的界面开发终结者 查看 98,411 回复 290
楼 主 DOS的界面开发终结者 发表于 2004-11-24 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线
我个人开发出了一个“WINSail” 软件,其完全是免费的一套软件,完整的
“库文件”、“头文件”“说明书”和“源代码”可在"www.FirstSail.B2B.Cn中下载得到。
它基于DOS系统,用Borland C++3.1语言,在Large大模式下开发出来的软件开发包。虽然说完整的软件包大约只有450K左右,却能在DOS下生成的程序具有与WIN9x完全相同的界面,拥有Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、示波器等界面元素,支持鼠标,控件的操作99.9%与Windows兼容!可加载运行脚本对话框;支持Socket套接字编程;具有完整窗口图形界面的最小应用只有150K左右,可在只有1M的电子盘中运行;具有0.5uS微秒精确度的delay函数。可以说 DOS + WinSail >= Windows CE

“WinSail工业控制开发系统”目前支持:
(1) “WinSail”的API与“C++ For DOS”函数库“共存”,特别是与C语言的图形函数BGI共存。
(2) 支持具有优先级的多任务,同时可达到50个任务。(注:可配置脚本文件来不需要多任务支持,使程序运行于单任务中) 。
(3) 支持数据库,生成的文件与Foxpro 2.6库兼容,可在微软Office的Excel中直接打开。
(4) 使用16*16的简体、繁体中文字库、8*16的英文字库,支持TrueType字库。
(5) “对话框”能在Visual C++预先做好界面,然后通过转换软件,能使Windows的对话框界面变成“WinSail”系统的对话框的界面代码源文件或脚本文件,充分利用Visual的优越性,使DOS平台的应用程序界面开发“不再难”!!!!!
(6) 支持600*480*16、600*400*256、800*600*256、1024*768*256多种分辩率。
(7) 支持Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、MessageBox、示波器、多元纵坐标示波器等界面元素。
(8) 支持扩展内存--XMS、扩充内存EMS的内存访问。
(9) 支持文本注册表--INI文件的读写,在写键值时,可保证在键值后面的“注释内容”仍然还存在。
(10) 支持面向对象的I/O访问,屏蔽底层I/O口。
(11) 具有COMM口通讯接口,支持多种校验位,包括“没有校验位”、“奇校验位”、“偶校验位”、“校验位永为1”、“校验位永为0”。后两种校验方式多用在多机通讯中区别“地址”和“数据”。
(12) 支持条形码显示。包括EAN_8、UPC_A、UPC_E、EAN_13(商品码)、ISBN、ISSN、39、128、Codabar、交叉25码
(13) 窗口支持“用I/O口定义的虚拟键盘”、“窗口定时器”、“空闲时调用某函数”、“窗口刷新时调用某函数”等多种回调函数。
(14) 多种常用数学运算,包括“低通”、“高通”、“带通”、“带阻”滤波器系数的产生(可加矩形窗、三角形窗、汉宁窗、海明窗、布莱克窗、Sin(x)/x窗、余弦窗、凯塞窗),滤波、插值、拟合、微积分、相关分析、FFT、DFT等。
(15) 统计进程SPC和直方图、测量的可靠性和重复性GageR&R报表。
(16) 支持“Bitmap”、“ICON”图像文件的显示、“Wav”声音文件的播放。
(17) 支持“普通示波器”和“多纵坐标示波器”。
(18) 支持Socket 套接字编程。
[已使用 Gemini 解答]
Gemini 解答

这是一套在 2000 年代初典型的面向工业控制(IPC / 工控机)场景的 16 位 DOS GUI 与运行库方案(WinSail)。其核心思路是基于 Borland C++ 3.1(BC31)构建一套仿 Windows/MFC 编程风格的轻量级开发框架,以兼顾 DOS 的高实时性与 Windows 风格的交互界面。以下对其关键技术实现、运行机制及技术局限进行分析与纠正。


1. 内存模型与实模式限制

  • 编译模型:工程采用 BC31 的 Large 内存模型(代码与数据指针默认均为 32 位 far 指针,每个代码/数据段限制为 64KB)。由于整个框架运行在 16 位 x86 实模式下,受 640KB 常规内存限制极为严重。
  • 数据缓冲机制:原帖提到 TCP/IP 协议栈的数据包及部分资源被放置在 XMS(扩展内存)中,这是 16 位实模式应用突破 640KB 限制的典型做法。实模式下访问 XMS 依赖 HIMEM.SYS 提供的 INT 2Fh(AX=4310h 获取驱动入口地址),通过 Block Move(功能号 0Bh)在常规内存与扩展内存之间来回拷贝数据,会产生一定的 CPU 拷贝开销。
  • 代码中 _strlen 的拼写错误:第 21 楼示例代码中声明的 extern unsigned _strlen = 60u * 1024u; 实际应为 _stklen(Borland C++ 的堆栈长度控制变量)。在 Large 模型下,默认堆栈较小,复杂 GUI 回调及中断重入极易引发堆栈溢出,因此需显式将 _stklen 扩大到 60KB 左右。

2. 多任务与中断调度机制

  • 调度原理:内核通过挂接 INT 08h(硬件时钟中断,IRQ0),重设 8253/8254 PIT(可编程定时计数器)Channel 0 的计数初值为 2048(原始值为 65536)。时钟频率由约 $18.2\text{ Hz}$(周期约 $54.925\text{ ms}$)提升至约 $586\text{ Hz}$(周期约 $1.71\text{ ms}$,即帖中所述的 $55/32\text{ ms}$)。
  • DOS 重入问题与“DOS 忙”检查:DOS 内核(INT 21h)本身是单重入的。抢占式多任务切换必须配合以下两个底层机制:
    1. InDOS 标志位:通过 INT 21h / AH=34h 获取 InDOS 标志的内存指针。当 *InDOS != 0 时,表明 DOS 正处于系统调用中,调度器禁止切换任务上下文。
    2. Error Mode 标志位(Critical Error Flag):发生 INT 24h 严重错误时同样不可重入。
  • 定时器链保护:修改 PIT 频率后,由于原本依赖 18.2Hz 的 BIOS 时钟服务(如系统时间更新、软驱停转延时)会被加速,框架必须对原始 INT 08h 进行分频调用(每 32 次自定义时钟中断仅调用一次原始 BIOS INT 08h),否则会导致系统时间异常飞快。

3. 图形子系统与分辨率支持

  • 显示驱动架构:工程包含 EgavgaF.ObjSVga_Dev.hEgavgaF.Obj 是 Borland BGI(Borland Graphics Interface)的标准驱动目标文件;而对于 800×600×256 或 1024×768×256 分辨率,则跳过了传统 BGI,直接通过 VESA VBE(Video BIOS Extensions, INT 10h AH=4Fh)设置显示模式并进行 Bank Switching(换页机制,通过 64KB 窗口映射 0xA0000 显存)。
  • Windows 2000 下的限制原因:原帖提到在 Windows 2000 NTVDM(虚拟 DOS 机)下只能运行 640×480×16 色。这是因为 Windows NT 内核(NT4/2000/XP)的 NTVDM 完全虚拟化了显卡底层,移除了对全屏自定义 VESA Bank 切换及非标准 VGA 寄存器(如 Twk16/ModeX)的直接硬件访问权限,仅对标准的 VGA Mode 12h(640×480 16色)提供稳定的软件仿真。

4. 0.5 微秒延时精度的工程边界

  • 原帖宣称具有“0.5uS 微秒精确度的 delay 函数”。在实模式 DOS 下,由于时钟中断(PIT)中断周期无法达到微秒级,此类微秒/亚微秒级延时通常通过以下两种方式之一实现:
    1. 直接读取 PIT 计数器:向端口 0x43 写入锁定命令(Latch Command),读取 Channel 0 计数值(基准频率约 $1.19318\text{ MHz}$,计数周期约 $0.838\text{ \mu s}$),达不到精确的 $0.5\text{ \mu s}$。
    2. TSC 时间戳计数器:在 80386 编译模式下如果直接内嵌汇编调用 Pentium 引入的 RDTSC 指令(读取 CPU 周期数),理论上在主频大于 2MHz 的机器上能达到亚微秒级精度。但在 DOS 实模式下,如果未关闭可屏蔽中断(CLI),延时期间发生的中断处理会严重破坏实际延时精度。

5. 网络协议栈实现基础

  • Packet Driver 标准:系统依赖网卡 Packet Driver(即遵循 FTP Software 的 PC/TCP Packet Driver 规范,挂接在 INT 60h ~ 0x80h 之间的软件中断)。
  • 协议栈设计:在 DOS 实模式下运行轻量级 TCP/IP(如早期基于 PC/TCP、WATTCP 改造的协议栈),由于没有操作系统原生线程支持,底层依靠轮询(Polling)或 Packet Driver 的接收中断回调处理报文。因实模式栈空间极度受限,复杂的 TCP 滑动窗口与乱序重组通常会被精简。

6. VC++ 对话框资源转换机制(MakeDlg)

  • MakeDlg.Exe 并不是直接执行 Windows 二进制,而是解析 VC++ 项目生成的 .rc(资源脚本文件)与 Resource.h 纯文本文件。
  • 它读取 DIALOG / DIALOGEX 定义段中的控件坐标(Dialog Units,需按字体宽高比转换为像素点)、控件类型(PUSHBUTTON, EDITTEXT, COMBOBOX 等)及样式标志,并将其映射生成为 WinSail 框架对应的 C++ 控件构造代码(如 CCustomCtrl)或自定义的二进制/文本布局脚本供运行时动态解析。这种设计大幅降低了纯代码手写 DOS 界面布局的难度。
本帖最近评分记录 (共 6 条) 点击查看详情
评分人分数时间
redtek +2 2006-11-07 21:17
pengfei +5 2006-11-15 22:28
henrya2 +4 2007-04-30 23:30
AlexZhang +4 2007-08-06 09:41
fqljwdyq +1 2007-12-12 19:00
153146156 +1 2008-06-01 02:12
2 发表于 2004-11-24 00:00 ·  中国 福建 福州 电信
元老会员
★★★
农民
积分 2,903
发帖 991
注册 2003-07-23 00:00
23年会员
UID 7391
性别 男
来自 福建省
状态 离线
哇!PFPF!这个GUI能做成一个完善的DOS Shell 吗?
艰难奋长戟,万古用一夫

中国DOS联盟 http://www.cn-dos.net 欢迎大家来共同学习
我的MSN&E-Mail cn_archer@hotmail.com QQ 56049418
3 发表于 2004-11-25 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线
能够! 用它能够做出像WIN95似的桌面系统。在www.FirstSail.B2B.Cn网页中下载WinSail.Zip后,里面有一个工程“Sail3000”目录,运行“Sail2000.Exe”可执行文件或“A.Bat”批处理文件就可以看到。 可运行在 (1)纯“DOS”系统(支持所有私有分辨率) (2)Win9X系统里面的“DOS”(支持所有私有分辨率) (3)Windows2000 Professional(只支持私有的640*480*16色)“分辨率”更改在“附件”的“显示属性”中修改。在工程里面有完整的源代码,工程文件是“Sail2000.Prj”,开发环境是Bc31。
4 发表于 2004-11-25 00:00 ·  中国 福建 厦门 电信
系统支持
★★★
积分 904
发帖 339
注册 2002-10-10 00:00
23年会员
UID 1904
来自 厦门
状态 离线
真的如此?DOwn来看看...
5 发表于 2004-11-25 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线
MakeDlg是一个WINDOWS程序,它的作用是将VC++工程的对话框转换成DOS下的"WInSail"开发平台的对话框,它可以生成5种形式 (1)int main3(int argc, char** argv)的函数形式 (2)int main3(int argc, char** argv)的函数形式 (3)void far VccFuncton(CObject *)的函数形式 (3)void far VccFuncton()的函数形式 (5)脚本文件第1~4形式是CPP文件源代码,须在BC31中将其编译后,方能使用第5种形式由于是脚本文件,可以用内核的AfxLoadDialog(char* pFileName)函数加载运行,也可以在“WinSail.Zip”的范例工程“Sail3000”目录里面的"Sail2000.Exe"运行该程序,“密码”为空,在菜单“附件”有“加载对话框脚本”菜单项,由它加载运行。得用该工具,您能开发出非常多精美的“对话框”。
6 发表于 2004-11-25 00:00 ·  中国 辽宁 丹东 联通
中级用户
★★
积分 316
发帖 74
注册 2004-03-04 00:00
22年会员
UID 19167
性别 男
状态 离线
真的这么厉害么
7 发表于 2004-11-25 00:00 ·  中国 广东 东莞 电信
初级用户
积分 117
发帖 5
注册 2004-07-10 00:00
22年会员
UID 28126
性别 男
状态 离线
看了一下,不错。厉害。向你学习。
8 发表于 2004-11-27 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线
WinSail内核运行在“实模式”下,目前增强了对"多任务"的支持,内核启动时将“挂接”时钟中断-INT8,并修改定时器0的初始计数值为2048, 系统会每55/32 = 1.72mS调度一个任务,任务调度时若当前任务正在“DOS忙”,则系统不切换任务,故在多任务编程时,应该尽量调用没有使用INT21中断的函数,如果在WINDOWS下运行,需将Config.Sys脚本文件中段的MultiMask键值置成"False",以便不修改INT8,而没有多任务的支持。详细可看说明书,可在Http://WWW.FirstSail.b2b.CN 中下载"WinSail"得到
9 发表于 2004-12-07 00:00 ·  中国 北京 顺义区 联通
初级用户
积分 109
发帖 4
注册 2004-09-14 00:00
22年会员
UID 31403
性别 男
状态 离线
真的有这么好吗?我荡一个看看
10 发表于 2004-12-07 00:00 ·  中国 广东 深圳 福田区 电信
初级用户
积分 183
发帖 31
注册 2003-08-01 00:00
23年会员
UID 7862
性别 男
状态 离线
给个MSN联系
11 发表于 2004-12-11 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线

WinSail内核目前全面支持“TCP/IP”协议,支持SOCKET套接字编程,由于WinSail是在DOS“实模式”下运行,故设计“TCP/IP”协议时,所有的“接收数据包”和“发送数据包”都被内核放在“扩展内存XMS”中,不占用“常规内存”的空间,故整个协议代码不占用多大的“空间”。 “协议”设计时,所有的“数据结构”和“套接字”函数接口,尽量与微软的“WINDOWS”文档兼容。 “WinSail”的设计之初,是懂“WINDOWS”编程的人,不费吹灰之力,就能在DOS下编程!!! Http://WWW.FirstSail.b2b.CN 中下载"WinSail"得到。(目前TCP/IP协议正在测试,载止到2004年12月11日,还不能下载到包含TCP/IP协议的WinSial。目前协议已经测试完成,但SOCKET套接字还正在测试...,可在2004年12月20日后,保证能下载到包括TCP/IP协议的“WinSail”。) 对于“楼上”说的MSN,将下载后的WinSail解压,里面有较简单的说明书,由于时间关系,详细说明书正在continue...,有问题,可发邮件到“szhello8@21cn.net”,或是“wave@public.guangzhou.gd.cn”
12 发表于 2004-12-12 00:00 ·  中国 广东 珠海 联通
中级用户
★★
bbpc
积分 340
发帖 107
注册 2004-04-11 00:00
22年会员
UID 22257
性别 男
状态 离线
不错,好!!!真的是在实模式下运行吗?我们公司的网站是www.baby-pc.com,看看能否在移植到我们的产品上,现在很多用户需要这样的GUI。如果可能的话可以合作。
x86!dos!
爱你就象老鼠爱大米
http://www.baby-pc.com/
13 发表于 2004-12-18 00:00 ·  中国 广东 深圳 罗湖区 电信
中级用户
★★
积分 223
发帖 52
注册 2004-03-07 00:00
22年会员
UID 19481
性别 男
状态 离线
很不错啊!技术文档很详细,是长期免费的吗?我很喜欢其中的界面开发和TCP/IP支持。研究研究。
14 发表于 2004-12-18 00:00 ·  中国 广东 深圳 罗湖区 电信
中级用户
★★
积分 223
发帖 52
注册 2004-03-07 00:00
22年会员
UID 19481
性别 男
状态 离线
看了,真的很不错!!对了,那个SAIL2000.EXE的登陆密码是什么?学习学习。
15 发表于 2004-12-18 00:00 ·  中国 广东 深圳 宝安区 电信
中级用户
积分 225
发帖 39
注册 2004-10-06 00:00
21年会员
UID 32162
性别 男
状态 离线
回答jiaking
对于Sail3000示例工程来说---------用户名是:super(小写),密码是:空
在2004年12月18日早上10时上传了“最新版的WinSail”,最小图形应用是“171K”,完整图形应用是“220K” “完整图形应用”比“最小图形应用”多了“示波器CGraph”、“多元示波器CTorqueGraph”、“桌面类CDesktop”、“对话框文件加载CDialog::LoadDailog()”、“登录框”、“权限修改”、“设备管理器”、“多任务管理器”的代码再过一个星期左右,含TCP/IP协议的、支持SOCKET套接字编程的内核将会上传,届时“最小图形应用”会增加30~50K左右的代码。
注“内核的TCP/IP协议是基于Packet Driver网卡驱动的”============================================================================WinSail的设计目的是用在工业上, 在电力系统应用中,本内核已完成其95%的工作, 在数控机床应用中,本内核已完成其75%的工作, 在智能仪器应用中,本内核已完成其80%的工作,
论坛跳转: