[求助]pb中如何使用wm_copydata接收和发送数据?

sam_info 2009-07-22 10:15:54
加精
最近在PB中使用WM_COPYDATA消息与第三方程序通讯时遇到困难,恳请指点!

//开发环境:winxp sp3 pro + pb8.04 10501
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义copydatastruct
global type str_copydatastruct from structure
long dwdata
long cbdata
long lpdata
end type

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//声明本地外部函数
SUBROUTINE CopyMemory(long pDesc, ref str_copydatastruct pSrc,ulong size) LIBRARY 'kernel32' ALIAS FOR 'RtlMoveMemory'
SUBROUTINE CopyMemory(ref str_copydatastruct pDesc, long pSrc,ulong size) LIBRARY 'kernel32' ALIAS FOR 'RtlMoveMemory'

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//w_test windows
//定义实例变量
CONSTANT Long WM_COPYDATA = 74 //74是WM_COPYDATA消息的消息号

//other event监听
//使用WM_COPYDATA消息接收数据
LONG ll_msg
string ls_test
str_copydatastruct lstr_data

setnull(ll_msg)
ll_msg=Message.Number
if ll_msg= WM_COPYDATA then
CopyMemory(lstr_data,lparam,12)
ls_test=string(lstr_data.lpdata,"Address")
mle_out.text=mle_out.text+'<<: '+ls_test+char(13)+char(10)
mle_out.text=mle_out.text+'--------------------------------'+char(13)+char(10)
LocalFree(lparam)
setnull(lstr_data.dwdata)
setnull(lstr_data.cbdata)
setnull(lstr_data.lpdata)
setnull(ls_test)
end if

return

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//cb_send使用WM_COPYDATA消息发送数据
long ll_rc,ll_len,long ll_copyDataPointer,ll_address
str_copydatastruct lstr_cds
string ls_src,ls_dst,ls_test

ls_src="我来了"
ls_dst =space(255)
ll_address=lstrcpy(ls_dst,ls_src)
//将ls_src的内容复制到ls_dst,并返回ls_dst的存储地址

ll_len=len(ls_src)+1
lstr_cds.dwdata=0
lstr_cds.cbdata=ll_len
lstr_cds.lpdata=ll_address

ll_copyDataPointer=LocalAlloc(0,12)
CopyMemory(ll_copyDataPointer,lstr_cds,12)
ll_rc=Send(hWnd_client,WM_COPYDATA,hWnd_server,ll_copyDataPointer)
//hWnd_client 为第三方程序句柄
//hWnd_server 为程序句柄
LocalFree(ll_copyDataPointer)

return

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题:
1.第三程序数据是不重复的,PB中所有接收数据与第一次接收数据相同.
2.使用WM_COPYDATA消息发送数据ll_rc返回值总是0,调用不成功.
3.PB中使用WM_COPYDATA消息与第三方程序通讯是否可行?
恳请指点,帮忙看看,我哪做错了?

谢谢!
Sam
sam_info@tom.com
...全文
2226 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjilai 2010-12-01
  • 打赏
  • 举报
回复
帮我看看这个问题。。有点类似~
http://topic.csdn.net/u/20101125/09/9cf85693-6242-4335-ac43-95d2f5cd741d.html?seed=1725532317&r=70264040#r_70264040
sam_info 2009-07-28
  • 打赏
  • 举报
回复
谢谢各位!

总结:
1.PB程序之间WM_COPYDATA通讯稳定;
2.PB程序使用WM_COPYDATA与非PB第三方程序通讯发送部分要用delphi或者vc写DLL才能稳定工作。

大家都忙,暂时没有搞定,再想办法将#21楼代码编译一个VC6 dll for pb。
结贴先!

再次谢谢各位!
WorldMobile 2009-07-27
  • 打赏
  • 举报
回复
呵呵,还是用delphi或者vc写个程序,把wm_copy发给那个程序处理,然后再通过别的方法发给pb程序,这样能稳定些
sam_info 2009-07-27
  • 打赏
  • 举报
回复
[#21楼]
无法编辑,修改不了.
spy++版本:
spy++ 7.10.3077.
sam_info 2009-07-27
  • 打赏
  • 举报
回复
谢谢!

TO:liubocy
[#6楼]
spy++ 1.10.3077监听:
1.测试PB程序之间wm_copydata通讯稳定,收发双方工作正常;收发双方都可监听到响应:S...,响应:R WM_COPYDATA fProcessed False [Result:00000000];
2.测试Delphi\VC程序[发]与第三方程序[收、非PB]wm_copydata通讯稳定,收发双方工作正常;发送程序可监听到响应:S...,响应:R WM_COPYDATA fProcessed True [Result:00000001],第三方程序只有响应:S...,没有响应:R;
3.测试PB程序[发]与第三方程序[收、非PB]wm_copydata通讯不稳定,PB发程序最多只监听到第一条wm_copydata消息,响应:S...,响应:R WM_COPYDATA fProcessed False [Result:00000000],第三方程序一直可监听到响应:S...,响应:R WM_COPYDATA fProcessed False [Result:00000000];
PB发程序最多只有第一条wm_copydata消息工作正常,不清楚原因.

4.附PB发送关键代码:
ls_dst =space(255)
ll_address=lstrcpy(ls_dst,ls_src)

ll_len=len(ls_src)+1
lstr_cds.dwdata=0
lstr_cds.cbdata=ll_len
lstr_cds.lpdata=ll_address

ll_sendlpdata=LocalAlloc(0,12)
CopyMemory(ll_sendlpdata,lstr_cds,12)
ll_rc = Send(m_hWnd_rec,WM_COPYDATA,m_hWnd_send,ll_sendlpdata)
LocalFree(ll_sendlpdata)
LocalFree(ll_address)

注意到liubocy的程序m_hWnd_send是long(0,0),我理解如果不需要对方响应,给值0,如果需要对方响应就给值handle(parent).
测试PB程序之间wm_copydata通讯时已证实.

TO:lzp_lrp,yangjue1
[#7楼,#13楼 ]
谢谢

TO:31737951
[#15楼]
不太明白,希望可以详细一点。谢谢!

TO:isisi
[#16楼]
可以分享vc写的dll吗?谢谢!
sam_info 2009-07-27
  • 打赏
  • 举报
回复
TO:isisi
VC6.0不会用,试了下编译出错,wmcds.dll - 9 error(s), 2 warning(s),能否请您帮忙把#21楼代码编译个VC dll for pb,谢谢!

sam_info 2009-07-27
  • 打赏
  • 举报
回复
#24楼写错了一点,
应该是
BOOL _stdcall WM_COPYDATA_SENDDATA(HWND hWnd_Receive,HWND hWnd_Send,LPCTSR lpszMsg)
sam_info 2009-07-27
  • 打赏
  • 举报
回复
VC6.0不会用,试了下编译出错,请会的朋友帮忙把以下代码编译个VC dll for pb,谢谢!

/////////////////////////////////////////////////////////////////////////////
// wmcds.h : main header file for the WMCDS DLL//
/////////////////////////////////////////////////////////////////////////////
// WM_COPYDATA_SENDDATA
extern "C" _declspec(dllexport) BOOL _stdcall WM_COPYDATA_SENDDATA(HWND hWnd_Receive,WHND hWnd_Send,LPCTSR lpszMsg);


/////////////////////////////////////////////////////////////////////////////
// wmcds.cpp : Defines the initialization routines for the DLL.
/////////////////////////////////////////////////////////////////////////////
// WM_COPYDATA_SENDDATA
extern "C" _declspec(dllexport)
BOOL _stdcall WM_COPYDATA_SENDDATA(HWND hWnd_Receive,WHND hWnd_Send,LPCTSR lpszMsg)
{
if (hWnd_Receive==0 || !lpszMsg || strlen(lpszMsg) < 1 ) return FALSE;

COPYDATASTRUCT CopyData = {0};

//在Win32中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。
//SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,
//这样发送方就不可能删除和修改数据。
//这个函数的原型为:SendMessage(WM_COPYDATA,wParam,lParam)
//其中wParam设置为包含数据的窗口句柄,lParam指向一个COPYDATASTRUCT的结构,
//COPYDATASTRUCT结构中,dwData为自定义数据,cbData为数据大小,lpData为指向数据的指针

char buf[1024] = {0};

va_list va;
va_start ( va, lpszMsg );
_vsnprintf ( buf, sizeof(buf) - 1, (char*)lpszMsg, va);
va_end(va);

CopyData.dwData = 0;
CopyData.lpData = (PVOID)buf;
CopyData.cbData = strlen(buf)+1;
if ( SendMessage ( hWnd_Receive, WM_COPYDATA, WPARAM(hWnd_Send),LPARAM(©Data)) == 0 ) //向hWnd_Receive程序发送消息
{
//SendMessage方法在消息发送出去后要求系统给与回复,如果没有成功则返回失败
return FALSE;
}
//如果发送成功,返回成功
return TRUE;
}


; wmcds.def : Declares the module parameters for the DLL.

LIBRARY "wmcds"
DESCRIPTION 'wmcds Windows Dynamic Link Library'

EXPORTS
; Explicit exports can go here
WM_COPYDATA_SENDDATA@1
shz775 2009-07-26
  • 打赏
  • 举报
回复
非常感谢~嘿嘿
liubocy 2009-07-25
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1516725

isisi 2009-07-25
  • 打赏
  • 举报
回复
发送使用vc写一个dll,接收侧直接响应74号消息即可取出。
pb的消息传送机制灵活性比vc差很多
31737951 2009-07-25
  • 打赏
  • 举报
回复
pb只能使用内存共享形式的 数据传输 不支持 dll全局静态变量的 使用 这跟dll的调用方式关系很大 建议封装一个内存映射的 dll来传数据
zjq_547758555 2009-07-25
  • 打赏
  • 举报
回复
关注中.....
yangjue1 2009-07-25
  • 打赏
  • 举报
回复

//other event监听
//使用WM_COPYDATA消息接收数据
LONG ll_msg
string ls_test

setnull(ll_msg)
ll_msg = Message.Number

if ll_msg = WM_COPYDATA then
ls_test = string(lparam,"Address")
mle_out.text=mle_out.text+' < <: '+ls_test+char(13)+char(10)
mle_out.text=mle_out.text+'--------------------------------'+char(13)+char(10)
end if

jinrongjian 2009-07-25
  • 打赏
  • 举报
回复
看不懂~~~
fuxiaoyang13 2009-07-25
  • 打赏
  • 举报
回复
学习!!!!!
GuanMingSoft 2009-07-25
  • 打赏
  • 举报
回复
关注中.....
hugh_z 2009-07-25
  • 打赏
  • 举报
回复
关注中.....
lao_bulls 2009-07-25
  • 打赏
  • 举报
回复
mark
newmanai 2009-07-25
  • 打赏
  • 举报
回复
新来的多关照
加载更多回复(8)

680

社区成员

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

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