一个关于剪贴版的问题 -=100分=-

Colin-Han 2003-10-27 10:50:06
我的一个程序,需要访问剪切版,所以使用了下面的代码:
COleDataObject obj;
if (obj.AttachClipboard())
{
if(obj.IsDataAvailable(CF_TEXT))
{
.....
}
}
但是在使用中,功能可以实现,但是在这段代码所在的函数退出时,会发生一个错误(chkesp.h),错误的大概意思是:使用了一个不同的调用转换(Calling convention)

那位兄弟知道是为什么?
...全文
9 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Colin-Han 2003-10-30
呵呵,谢谢,看来是我的系统有问题了!!!!!!非常感谢!
回复
我昨天的那段代码,就是在xp下运行的。
回复
Colin-Han 2003-10-29
终于找到问题的所在了,原来是我的操作系统有问题,有没有人用的是WinXP,帮我试一下

在我的同事的Win2K的机子上运行就不出问题!!!!!更加的郁闷!!!!!

如果没有什么异议,明天结贴!!!!
回复
Colin-Han 2003-10-29
我对这个问题的理解,应该是在作栈操作时产生错误了,(ESP是栈指针),而且,在跟踪调试的过程中也确实发现在调用obj.IsDataAvailable(CF_TEXT)函数后,栈指针(ESP)产生了8个字节的偏差(据我理解,在进行调用(汇编指令CALL)后,栈指针应该不变,否则程序调用会发生混乱,所以,我认为这里的程序确实存在问题,但是我不知道怎样解决,因为这个似乎是VC编译产生的错误。(当然,一般情况下如果一个程序员这样说,往往证明他没有将VC领会透彻:-)呵呵!!)

希望哪位高手能给我一点指点。请MilitaryMiniatures(++) 也跟踪一下你的测试程序,看看是否发生这样的错误,谢谢了!!!
回复
Colin-Han 2003-10-29
所有的程序再CJ608的DevStudioUIDome中都是可以正常运行的,但是在我的项目中却不能正常运行,很奇怪,我使用调试察看他们编译后的汇编代码,发现两边的差别就是在调用了一个_chkesp函数,谁知道他是干什么的?

实在太苦闷了,我也觉得是项目设置有问题,但是我仔细比较了两个项目的设置,没有什么实质性的区别。

郁闷!!!!!!郁闷!!!!!郁闷!!!郁闷!!郁闷!!!!!!郁闷!!!郁闷!!!!!!!
回复
不知道你的问题具体是什么,不过,我做了如下的测试代码,是没有问题的,供参考:
#include "AfxOle.h"
void CTestDlg::OnOk()
{
COleDataObject obj;
if (obj.AttachClipboard())
{
if (obj.IsDataAvailable(CF_TEXT))
{
STGMEDIUM stg;
if (obj.GetData(CF_TEXT, &stg))
{
LPCTSTR str = (LPCTSTR)::GlobalLock(stg.hGlobal);
if (str != NULL)
{
SetDlgItemText(IDC_EDIT1, str);
}
::GlobalUnlock(stg.hGlobal);
::ReleaseStgMedium(&stg);
}
}
}
}
注意,调用这段代码之前,需要进行OLE初始化,可以通过调用OleInitialize(NULL)来实现。
回复
Colin-Han 2003-10-28
错误信息如下:
--------------------------------------------------------------------------
Debug Error!

Program: E:\Cajon\My Project\CCWD\Codes\ModelBase\Debug\ModelBase.exe
Module:
File: i386\chkesp.c
Line: 42

The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

(Press Retry to debug the application )
回复
Colin-Han 2003-10-28
谢谢大家的回答!

程序是在函数结束时发生错误的,但是我通过禁用其中部分代码的方法,发现只要注释掉下面的代码,程序就可以正常运行了。
if(obj.IsDataAvailable(CF_TEXT))
{
.....
}
所以,我认为问题是出在这里,请大家在帮帮我。而且程序中没有什么临时变量之类的东西。

to tserpent(Tang):
我已经检查过了,设置是正确的,但是还是出错

这一段代码是CJ608库的演示代码DevStudio中的一部分代码,在他原有的演示程序中一切正常,但是我的程序里面就不行,这段代码的具体位置为:
CJLibaray->DevStudioUIDemo->CHexEdit->OnContextMenu函数->第33行
回复
tserpent 2003-10-28
有可能和你的工程的设置有关系,检查一下project-->setting-->c++->code generation-->calling convention, 是__stdcall,还是__cdcel. 我简单试了一下,没有出问题,我的__cdcel,mutilthread dll.
回复
Colin-Han 2003-10-27
在线等待,一定结贴
回复
flinming 2003-10-27
up
回复
你是不是定义了临时变量?比如数组?然后数组操作越界了?把你省略部分的代码贴出来看看吧。
回复
lsl7909 2003-10-27
AttachClipboard()这应该没没问题,COleDataObject析构函数自动释放。是不是其它的问题呢?
回复
Colin-Han 2003-10-27
你说的是AttachClipboard吗?应该怎样Detach呢?好像没有DetachChipboard这个方法
回复
flyhigh 2003-10-27
attach and detach
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2003-10-27 10:50
社区公告
暂无公告