自定义复制粘贴,在2000,xp下没有问题,98下粘贴时报错

jhshen 2005-11-01 04:23:28
我的做法:
复制时先把Stream写入剪贴版,代码片断:
Data := GlobalAlloc(GMEM_MOVEABLE, msCopyCalc.Size);

try
DataPtr := GlobalLock(Data);
try
Move(msCopyCalc.Memory^, DataPtr^ , msCopyCalc.Size);
ClipBoard.Open;
try
ClipBoard.SetAsHandle(CF_Calculate, Data);
finally
Clipboard.Close
end;
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;

粘贴时代码片断:
hbuf := Clipboard.GetAsHandle(CF_Calculate);

if hbuf = 0 then Abort;

bufptr := GlobalLock(hbuf);

if bufptr = nil then Exit;

try
mstream := TMemoryStream.Create;
try
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf)); //此行出错,GlobalSize(hbuf)返回值为0
mstream.Position := 0;
................
finally
mstream.Free;
end;
finally
GlobalUnlock(hbuf);
end;

该程序在win2000,xp下都没有问题,但是在98下GlobalSize(hbuf)获取的内存大小为0,不知道什么原因?哪位高手能否赐教?
...全文
92 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhshen 2005-11-02
  • 打赏
  • 举报
回复
ShowMessage('GlobalSize='+IntToStr(GlobalSize(hbuf)));
mstream := TMemoryStream.Create;
ShowMessage('GlobalSize='+IntToStr(GlobalSize(hbuf)));

第一个messagebox显示的是正常的数值,第二个messagebox显示0,也就是说在TMemoryStream.Create后,很可能内存被释放了,我再查一下
aiirii 2005-11-02
  • 打赏
  • 举报
回复
还可以用 GlobalFlags 检查下先

To verify that the specified object's memory block has not been discarded, use the GlobalFlags function before calling GlobalSize.
aiirii 2005-11-02
  • 打赏
  • 举报
回复
在 hbuf := Clipboard.GetAsHandle(CF_Calculate);
后,用 GetLastError 看有没有出错
jhshen 2005-11-02
  • 打赏
  • 举报
回复
没人回答?
jhshen 2005-11-02
  • 打赏
  • 举报
回复
软件开发的时候,我就没打算兼容9x,没想到软件开始销售后,发现还是有人多人在用98。
郁闷ing.
ly_liuyang 2005-11-02
  • 打赏
  • 举报
回复
9x,一早放弃了,呵呵:)

ASM级别Debug下吧

_____________________
http://lysoft.7u7.net
jhshen 2005-11-02
  • 打赏
  • 举报
回复
还是没解决

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧