|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
『楼 主』:
[原创]dos,win9x串口调试助手及源码
小程序调着玩的,有什么建议可以联系fgc_kfl@sina.com. 感谢郭恒的winsail,
终于不用在dos下一个一个界面画了!!!!
要求版主适量加分!!!
[ Last edited by fgckfl on 2008-3-1 at 12:09 PM ]
|
|
2008-3-1 12:07 |
|
|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
|
2008-3-1 12:23 |
|
|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
|
2008-3-1 12:26 |
|
|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
|
2008-3-1 12:30 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
5 楼』:
查看了一个代码,有一个地方“指针”有错,
void far OnTime_DemoCUartDialog(CObject* pCurObj)
{
//...
//这里有错,最终的pDialog是空指针NULL
CDialog* pDialog = (CDialog *)pCurObj->GetParent();
//应改为
CDialog* pDialog = (CDialog *)pCurObj;
//...
}
(1)对于窗口的回调函数,形参一般是窗口指针(“this”),所以
CWindow* pWindow = (CWindow *)pCurObj;或
CDialog* pDialog = (CDialog*)pCurObj;
(2)对于控件的回调函数,形参一般是控件指针
CWindow* pWindow = (CWindow *)pCurObj->GetParent();或
CDialog* pDialog = (CDialog *)pCurObj->GetParent();
(3)在用Visual C++6.0做界面时,对话框请用“9号宋体”,由于WinSail是用
16x16的字体,所以“CLabel”控件后应预留多一点的空地。
高级界面的一般开发流程如下所示
01:启动Visual C++6.0,建立一个新的App工程。
02:在资源中建立一新的对话框,并确入将对话框的属性已经设置为“9号宋体”。
03:在对话框中加入所需要的控件。
04:调整各控件座标位置,必要时可以用菜单的[编排]->[Tab Order]设置控件的顺序。
05:确认存盘
06:启动MakeDlg.Exe程序,如果已经启动则可用“Alt +Tab组合键”切换到该程序。
07:MakeDlg.Exe程序中,设置正确的*.rc和resource.h文件所在的路径
08:MakeDlg.Exe程序中,在ID列表中选择对应的“对话框ID号”
09:MakeDlg.Exe程序中,将“生成文件”设置为Sail3000目录下的abc3.Cpp文件。
10:MakeDlg.Exe程序中,将“生成类型”设置成“脚本形式”,
11:MakeDlg.Exe程序中,点击确定按钮,生成abc3.cpp脚本文件
12:启动DOS下的sail3000工程的a.bat或Sail2000.exe,如果已经启动则可用“Alt +Tab组合键”切换到该程序。
13:在sail2000程序的菜单中,启动[附件]->[对话框脚本]程序
14:将“脚本文件”设置成“abc3.Cpp”,点需“加载运行”按钮
15:观察对话框脚本文件对应的界面是否满意,如果不满意,重复“04-15”步。
16:如果满意,将makedlg.Exe程序中的“生成类型”改成Cpp类型,最终生成源代码。
17:将生成的源代码拷贝到自己的开发工程目录中,并人工去掉“冗余”代码,加入“所需”代码。
[ Last edited by firstsail on 2008-3-3 at 08:09 PM ]
|
|
2008-3-3 18:23 |
|
|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
『第
6 楼』:
谢谢 firstsail
几天没上网,正在做并口和can的调试,做完后再向你请教winsail.经过前段时间
试用感觉winsail非常好用,大大减轻了dos下程序开发的工作量.只是我现在对
扩展内存的使用还不是很明白,呵呵,现在都找不到相关资料了.
什么时候能写篇详细文章介绍下就好了.
|
|
2008-3-7 20:58 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
7 楼』:
参看《微机内存管理指南》一书,是1998年出版的,我于2004年在广州购书中心购得。
该书的ISBN号是“9787115067203”,即“ISBN 7-115-06720-1”
找该书的途径推荐如下:
(1)书店
(2)网上搜索
(3)大学图书馆
(4)其它
----------------------------------------------------------------------------------------------------
功能号 功能 功能号 功能
00H 取XMS版本号
01H 请求高内存区HMA
02H 释放高内存区HMA
03H 全程使能A20地址线
04H 全程禁止使能A20地址线
05H 局部使能A20地址线
06H 局部禁止使能A20地址线
07H 查询A20地址线的状态
08H 查询自由扩展内存
09H 分配扩展内存块
0AH 释放扩展内存块
0BH 移动扩展内存块
0CH 锁住扩展内存块
0DH 扩展内存块解锁
0EH 取EMB句柄信息
0FH 重新分配扩展内存块
10H 请求高端内存块UMB
11H 释放高端内存块UMB
(1) 功能号装入AH寄存器,WinSail只封装了红色部份功能号。
(2) 返回值中,AX寄存器值为“1”表示成功执行,为“0”表示失败,BL寄存器的值表示出错代码。
(3) 中断向量链接在中断2FH上,可以通过下面代码获得入口点
void* g_pIntVector = NULL; //全局变量
void GetIntVector()
{
union REGS mRegs;
struct SREGS mRegSegs;
mRegs.x.ax = 0x4310;
int86x(0x2F, &mRegs, &mRegs, &mRegSegs);
*(((WORD *)& g_pIntVector) + 0) = mRegs.x.bx;
*(((WORD *)& g_pIntVector) + 1) = mRegSegs.es;
return;
}
[ Last edited by firstsail on 2008-3-10 at 01:29 PM ]
|
|
2008-3-10 11:17 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
8 楼』:
//分配内存块,以K字节为单位,返回值为句柄号
WORD MallocXms(WORD wSizeK) //以K为单位
{
BOOL bResult;
WORD hBlock = NULL;//句柄号
void* pVector = g_pIntVector;
asm mov ah, 09H
asm mov dx, wSizeK
asm call [pVector]
asm mov bResult, ax
asm mov hBlock, dx
return ((bResult) ? hBlock: NULL);
}
//释放内存块
BOOL FreeXms(WORD hBlock)
{
BOOL bResult;
void* pVector = g_pIntVector;
asm mov ah, 0AH
asm mov dx, hBlock
asm call [pVector]
asm mov bResult, ax
return ((bResult) ? TRUE : FALSE);
}
|
|
2008-3-10 13:29 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
9 楼』:
//内存块移动参数表
typedef struct _tagXMSMOVEPARAMETERBLOCK
{
DWORD dwCount;//移动的字节数,必须是偶数
HANDLE hSource;//源块的名柄号,为0时,源块地址由下面两个给出
WORD wSourceOffset;//源块名柄号为0时,源内存块的偏移地址
WORD wSourceSeg;//源块名柄号为0时,源内存块的段地址
HANDLE hTarget;//目的块名柄号,为0时,目的块地址由下面两个给出
WORD wTargetOffset;//目的块名柄号为0时,目的内存块的偏移地址
WORD wTargetSeg;//目的块名柄号为0时,目的内存块的段地址
}XMSMOVEPARAMETERBLOCK;
//读XMS内存部份内容,字节数必须为偶数,否则须改动该函数
BOOL ReadXms(WORD hBlock, DWORD dwIndex, void* pBuffer, DWROD dwCount)
{
void* pStr = pBuffer;
DWORD dwNewCount = dwCount;
DWORD dwNewIndex = dwIndex;
void* pVector = g_pIntVector;
if ((dwCount % 2) != 0) //对奇字节进行处理
{
//这里略去实现部份
//......
}
XMSMOVEPARAMETERBLOCK mXmsMoveParameterBlock;
mXmsMoveParameterBlock.dwCount = dwNewCount;
mXmsMoveParameterBlock.hSource = hBlock;
mXmsMoveParameterBlock.wSourceOffset = LOWORD(dwNewIndex);
mXmsMoveParameterBlock.wSourceSeg = HIWORD(dwNewIndex);
mXmsMoveParameterBlock.hTarget = NULL;
mXmsMoveParameterBlock.wTargetOffset = FP_OFF(pStr);
mXmsMoveParameterBlock.wTargetSeg = FP_SEG(pStr);
WORD wOffset = FP_OFF(&mXmsMoveParameterBlock);
WORD wSegment = FP_SEG(&mXmsMoveParameterBlock);
asm push si
asm push ds
asm mov ah, 0BH
asm mov si, wOffset
asm mov ds, wSegment
asm call [pVector]
asm mov bResult, ax
asm pop ds
asm pop si
return ((bResult) ? TRUE : FALSE);
}
|
|
2008-3-10 13:30 |
|
|
firstsail
高级用户
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
10 楼』:
//写XMS内存部份内容,字节数必须为偶数,否则须改动该函数
BOOL WriteXms(WORD hBlock, DWORD dwIndex, void* pBuffer, DWROD dwCount)
{
void* pStr = pBuffer;
DWORD dwNewCount = dwCount;
DWORD dwNewIndex = dwIndex;
void* pVector = g_pIntVector;
if ((dwCount % 2) != 0) //对奇字节进行处理
{
//这里略去实现部份
//......
}
XMSMOVEPARAMETERBLOCK mXmsMoveParameterBlock;
mXmsMoveParameterBlock.dwCount = dwNewCount;
mXmsMoveParameterBlock.hSource = NULL;
mXmsMoveParameterBlock.wSourceOffset = FP_OFF(pStr);
mXmsMoveParameterBlock.wSourceSeg = FP_SEG(pStr);
mXmsMoveParameterBlock.hTarget = hBlock;
mXmsMoveParameterBlock.wTargetOffset = LOWORD(dwNewIndex);
mXmsMoveParameterBlock.wTargetSeg = HIWORD(dwNewIndex);
WORD wOffset = FP_OFF(&mXmsMoveParameterBlock);
WORD wSegment = FP_SEG(&mXmsMoveParameterBlock);
asm push si
asm push ds
asm mov ah, 0BH
asm mov si, wOffset
asm mov ds, wSegment
asm call [pVector]
asm mov bResult, ax
asm pop ds
asm pop si
return ((bResult) ? TRUE : FALSE);
}
|
|
2008-3-10 13:31 |
|
|
fgckfl
初级用户
积分 46
发帖 22
注册 2006-11-13
状态 离线
|
|
2008-3-14 11:17 |
|