DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sprblck
今日帖子: 10
在线用户: 17
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2021/9/24 20:10:20
标题:
用 WM_COPYDATA 消息发字符串 浏览:1330
加入我的收藏
楼主: 用 SendMessageTimeout 发 WM_COPYDATA 消息发字符串,会被截断部份,
用 SendMessage 就不会被截断。是什么原因?

用 WTSSendMessage 给别的用户发字符串,也会被截断。
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2021/9/24 20:49:09
1楼: 大概率是你没有用对,这些都是非常成熟的东西了.

https://docs.microsoft.com/en-us/windows/win32/dataxchg/using-data-copy
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2021/9/24 21:34:56
2楼: 这是测 试代码,试试?
此帖子包含附件:dalas_2021924213456.rar 大小:26.1K
----------------------------------------------
-
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2021/9/24 21:38:49
3楼: 字符串被截断一半
此帖子包含附件:
PNG 图像
大小:4.2K
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/9/24 23:14:45
4楼: SendMessage  可以无视长度=cbData
SendMessageTimeout 长度必须对=cbData 
简单点得测·   试就是 
Button2Click 改
  CopyData.cbData := 10{Length(pText)}; //至于为何得出是5不是10 我也纳闷

不知蓝色圈中得5是不是。。。得出得5呢。。 但是byte占位10啊?

调试了下代码运行得复制的这行没运行下面的汇编??
function _PWCharLen(P: PWideChar): Integer;
begin
  Result := 0;
  if P <> nil then
    while P[Result] <> #0 do
      Inc(Result);//inc  +1的意思??不是加2吗?。。
end;
然后看下上面的代码
function _PCharLen(P: _PAnsiChr): Integer;
begin
  Result := 0;
  if P <> nil then
    while P[Result] <> #0 do
      Inc(Result);//??也是inc +1 ????????
end;
此帖子包含附件:
PNG 图像
大小:2,248B
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2021/9/24 23:30:27
5楼: cbData

Type: DWORD

The size, in bytes, of the data pointed to by the lpData member.

cbData 是以byte为单位的, Length(str)返回的是字符数, 
用 SysUtils.ByteLength(str)来返回字节为单位的长度

CopyData.cbData :=SysUtils.ByteLength(pText)+2;
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/9/24 23:38:34
5楼:   CopyData.cbData :=Length(pText)*sizeof(widechar);
  CopyData.lpData :=PChar(pText);
这样就好了。
既然复制了长度数据 不#0 也没关系吧?。。 不会出现垃圾数据 接上 1后面吧?表示怀疑。
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2021/9/25 7:51:16
6楼: 复制后面的#0有好处: 必要时可以将地址强制转化为PChar
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2021/9/25 9:51:19
7楼: 试了下两位的办法:
ByteLength(str)来返回字节为单位的长度

CopyData.cbData :=Length(pText)*sizeof(widechar);

都可以,中英文混和也正常,太赞了!!
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/9/25 10:34:33
8楼: 根据hardnut 的说法 建议加 #0
也就是用
CopyData.cbData :=SysUtils.ByteLength(pText)+2;(此处+2=#0)
不加有可能会拿到edit1后面还有辣鸡数据的风险
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS