




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET Compact Framework下的进程间通信之Windows Message在Wince和Windows Moblie 下的进程间通信可以由以下几种技术实现。1. Windows Message2. Point-to-Point Message Queues3. MSMQ下面使用讲述.NET Compact Framework下使用Windows Message进行进程间的通信。引用库在CF.net下进行Windows Message的开发需要引用Microsoft.WindowsCE.Forms,该DLL一般存放于C:Program FilesMicrosoft.NETSDKCompactFrameworkv2.0WindowsCEMicrosoft.WindowsCE.Forms.dll发送消息usingMicrosoft.WindowsCE.Forms;publicpartialclassMsgForm:FormDllImport(coredll.dll,EntryPoint=RegisterWindowMessage,SetLastError=true)privatestaticexternuintRegisterWindowMessage(stringlpString);privateuintmsgUid=RegisterWindowMessage(MESSAGE_UID);public static int MSG_BROADCAST = 0xFFFF;privatevoidSendMessage(objectsender)Messagemsg=Message.Create(IntPtr)MSG_BROADCAST,(int)msgUid,IntPtr.Zero,IntPtr.Zero);MessageWindow.SendMessage(refmsg);首先需要P/Invoke RegisterWindowMessage 函数,每个发送的message都有唯一的UID,这样接收方才能根据UID进行监听和接收该Message。发送之前先create一个Message对象,参数一为接收对象,如果为进程间通信可以使用广播的形式(MSG_BROADCAST),第二个参数为message的UID,接收方利用这一表示辨别message。第三和第四分别为WParam和LParam,这是标准windows message的传递参数。接收消息usingMicrosoft.WindowsCE.Forms;publicclassMsgWindow:MessageWindow DllImport(coredll.dll,EntryPoint=RegisterWindowMessage,SetLastError=true)privatestaticexternuintRegisterWindowMessage(stringlpString);privateuintmsgUid=RegisterWindowMessage(MESSAGE_UID);protectedoverridevoidWndProc(refMessagemsg)if(msg.Msg=msgUid)/handlethemessage. 接收消息需要定义一个继承类,继承于MessageWindow,同时他同样需要P/Invoke RegisterWindowMessage 函数,定义接收message的唯一UID。重写WndProc,然后通过msg.Msg 来辨别关心的消息。使用Form处理Message如果接收方接收到message需要更新到form的话就定义一个form的reference,这样可以利用form来处理消息。其实不一定使用Form来处理message,使用Form就能比较方便的利用ui来反映message的接收和处理情况。publicpartialclassMsgForm:FormprivateMsgWindowMsgWin;publicMsgForm() /passtheformreferencetomessagewindowthis.MsgWin=newMsgWindow(this);publicclassMsgWindow:MessageWindowprivateMsgFormmsgForm;publicMsgWindow(MsgFormmsgForm) this.msgForm=msgForm; protectedoverridevoidWndProc(refMessagemsg) if(msg.Msg=msgUid) /callformtohandlethemessage. msgForm.HandleMsg(); MsgWindow 保存MsgForm 的引用,这样当MsgWindow 接收到消息就可以使用form来处理。消息中传递对象如果在消息中传递对象,就不可以使用.NET Compact Framework里面的MessageWindow.SendMessage函数了,需要使用P/Invoke来进行发送。发送端的关键是把要传递的对象封装到COPYDATASTRUCT Structure里面,然后通过APISendMessageW进行发送,接收方辨别WM_COPYDATA消息,从LParam中分拆出对象。 publicstructCOPYDATASTRUCTpublicintdwData;publicintcbData;publicIntPtrlpData;classcMsgStringsconstintLMEM_FIXED=0x0000;constintLMEM_ZEROINIT=0x0040;constintLPTR=(LMEM_FIXED|LMEM_ZEROINIT);constintWM_COPYDATA=0x004A;DllImport(coredll.dll)publicstaticexternIntPtrLocalAlloc(intflag,intsize);DllImport(coredll.dll)publicstaticexternIntPtrLocalFree(IntPtrp);DllImport(coredll.dll)publicstaticexternintSendMessageW(IntPtrhWnd,intMsg,IntPtrwParam,IntPtrlParam);publicstaticIntPtrAllocHGlobal(intcb)IntPtrhMemory=newIntPtr();hMemory=LocalAlloc(LPTR,cb);returnhMemory;publicstaticvoidFreeHGlobal(IntPtrhMemory)if(hMemory!=IntPtr.Zero)LocalFree(hMemory);publicstaticvoidSendMsgString(IntPtrhWndDest,stringsScript)COPYDATASTRUCToCDS=newCOPYDATASTRUCT();oCDS.cbData=(sScript.Length+1)*2;oCDS.lpData=LocalAlloc(LPTR,oCDS.cbData);Marshal.Copy(sScript.ToCharArray(),0,oCDS.lpData,sScript.Length);oCDS.dwData=1;IntPtrlParam=AllocHGlobal(oCDS.cbData);Marshal.StructureToPtr(oCDS,lParam,false);SendMessageW(hWndDest,WM_COPYDATA,IntPtr.Zero,lParam);LocalFree(oCDS.lpData);FreeHGlobal(lParam);/sendthemessagewithstringprivatevoidbutton1_Click(objectsender,EventArgse)unsafecMsgStrings.SendMsgString(IntPtr)MSG_BROADCAST,textBoxMsg.Text);上面为发生端的代码,通过cMsgStrings.SendMsgString进行发送,可以把任何managed的object封装到COPYDATASTRUCT 进行发送。publicclassMsgWindow:MessageWindowconstintWM_COPYDATA=0x004A;privateFormReceivermsgForm;publicMsgWindow(FormReceivermsgForm)this.msgForm=msgForm;protectedoverridevoidWndProc(refMessagemsg)if(msg.Msg=WM_COPYDATA)stringstr=GetMsgString(msg.LParam);msgForm.HandleMsg(str);publicstaticstringGetMsgString(IntPtrlParam)if(lParam!=IntPtr.Zero)COPYDATASTRUCTst=(COPYDATASTRUCT)Marshal.PtrToStructure(lParam,typeof(COPYDATASTRUCT);stringstr=Marshal.PtrToStringUni(st.lpData);returnstr;elsereturnnull;上面为接收端的代码,辨别WM_COPYDATA的消息从LParam中取出传递的对象。taob tbw BB霜 BB霜 CC霜 CC霜 www.qii.c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 太原城市职业技术学院《微生物学检验实验》2023-2024学年第二学期期末试卷
- 建东职业技术学院《医学微生物学D》2023-2024学年第二学期期末试卷
- 技术在教育心理干预中的实践应用
- 江西泰豪动漫职业学院《当代文学思潮》2023-2024学年第二学期期末试卷
- 武汉铁路职业技术学院《术课教学法》2023-2024学年第二学期期末试卷
- 六安职业技术学院《现代教育技术与数学教学技术应用》2023-2024学年第二学期期末试卷
- 智慧办公的新篇章利用教育大数据实现员工培训的个性化
- 江苏电子信息职业学院《历史教学技能实训》2023-2024学年第二学期期末试卷
- 廊坊燕京职业技术学院《建筑环境测试技术》2023-2024学年第二学期期末试卷
- 洛阳科技职业学院《动物育种原理与方法》2023-2024学年第二学期期末试卷
- 生态环境保护与可持续发展智慧树知到期末考试答案章节答案2024年浙江农林大学
- MH-T 5003-2016 民用运输机场航站楼离港系统工程设计规范
- 专题24 生物的进化-备战2024年中考《生物》复习全考点
- 康复治疗技术专业《临床疾病概要1》课程标准
- 中医治疗失眠课件
- 人教版四年级数学上册全册电子教案
- 人口与贫困问题
- 大宗贸易培训课件讲解
- 第七届全国急救技能大赛(医生组)理论考试题库大全-上部分
- 《癌痛与癌痛治疗》课件
- 经空气传播疾病医院感染预防与控制规范课件
评论
0/150
提交评论