| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1496 人关注过本帖
标题:SetConsoleCursorPosition调用无效
只看楼主 加入收藏
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
SetConsoleCursorPosition调用无效
SetConsoleCursorPosition调用无效,向高手请教
SetConsoleCursorPosition都是正确的传入的,在OD下看也没有看出什么问题,能正常调用和返回。
我用FormatMessage获得错误信息 为:参数不正确
 

完整源代码:

.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib
.data
 stCursor COORD <>    ;结构变量
 stdHandle dword ?    ;控制台输出句柄
 
 
 messageID dword ?    ;消息ID
 pErroMsg dword ?     ;保存系统分配的缓冲区指针
.code
start:
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov stdHandle,eax
   
    ;设置光标位置
    mov stCursor.x,5
    mov stCursor.y,10
     
    invoke SetConsoleCursorPosition,stdHandle, addr stCursor
    call GetLastError   
    mov messageID,eax    ;返回消息ID
    invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,NULL,messageID,0,addr pErroMsg,0,0
   
;    invoke Sleep,2000   ;挂起2秒,观看效果
end start

搜索更多相关主题的帖子: 控制台 源代码 缓冲区 
2012-08-21 21:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
BOOL WINAPI SetConsoleCursorPosition(
  _In_  HANDLE hConsoleOutput,
  _In_  COORD dwCursorPosition
);

2012-08-21 21:31
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
    invoke SetConsoleCursorPosition,stdHandle,DWORD ptr stCursor

改成这样就没错了
2012-08-21 21:34
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
没看见本版其他人问的么 可以用masm32.inc里面提供的那些函数输入输出 不必要自己写

程序代码:
.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc

includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
    lpMsg        db "Hello World!",0
   
.data?
    buffer    db MAX_PATH dup(?)
   
.CODE
START:
   
    invoke locate,2,2            ;设定输出文本的坐标
    invoke StdOut,offset lpMsg
   
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START



看看masmplus提供的模版罢

2012-08-21 21:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我马上专家分就过万了 帮我早日实现这一愿望罢 速度结题哦
2012-08-21 21:38
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
收藏
得分:0 
回复 3楼 zklhp
可以了,为什么会这样。我不加DWORD PTR 的时候OD下的参数注释竟然 是X=12888,Y=64  加入后看OD的参数注释就正常了。一开始我还忽略了OD注释的参数。= =!
还有这个DOORD是 WIN32的结构体。在VC下用几乎没有什么问题。到了WIN32这个函数就有问题了,,其他的WIN32结构体也没有这种现象。奇怪之极

 
2012-08-21 21:55
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
收藏
得分:0 
dwCursorPosition  这个参数按理是传入结构变量地址就OK了。API会引用结构变量的首地址。(VC下就是这样来使用的)。可谁知道
2012-08-21 21:57
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
如果传入参数是指针你那样是对的 可是这里不是指针啊 这个结构体就相当于一个双字 压地址和压这个结构体没啥区别
2012-08-21 22:02
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
收藏
得分:0 
回复 8楼 zklhp
我算明白了。这个函数的第二个参数不是传入结构变量的地址。他是按值传递的。
我在msnd 看了函数的原型才知道 dw 前裔 不是lp = =!
BOOL SetConsoleCursorPosition(
  HANDLE hConsoleOutput,  // handle to screen buffer
  COORD dwCursorPosition  // new cursor coordinates);
2012-08-21 22:39
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
收藏
得分:0 
回复 8楼 zklhp
OD下看堆栈的参数得知 SetConsoleCursorPosition 函数的第二个参数是按值来使用,而不是按地址引用的。如果你传入地址,那么SetConsoleCursorPosition函数将你堆栈上的地址 就被分成x 和 y 坐标了。而不是去引用你的结构变量地址处的值。  谢谢你了。呵呵
2012-08-21 22:43
快速回复:SetConsoleCursorPosition调用无效
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040710 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved