分享

能否从vcDLL函数向上层MFC窗口传递一个消息,该如何做

 noairman 2010-03-28
已经做好了一个驱动调用的DLL函数,在里面一个子程序是当接收完数据是通过事件响应告诉上层数据接受完毕,我自己编了一个WIN32的测试程序是可以通过的,但是老师要用DELPHI来调用,希望是给上层窗口一个消息,我就自己生成一个MFC单文档来测试,那在MFC中应该在哪块加载dll,并且获取函数指针,并且在下层的dll函数中如何向上层发送这个消息?直接用SendMessage或者PostMessage发送,在得到窗口指针和消息号的情况下(通过上层调用传递这两个参数?),同时在MFC中自己添加这个消息响应机制!
答:>exe向dll传入句柄,双方协议一个自定义消息
答:>MFC的话,可以直接用SendMessage,发送WM_COPYDATA消息,界面可以重写OnCopyData。
答:>dll不是MFC的,就是win32的,我现在就是什么都不做,就是直接调用dll函数发送一个消息到上层<br>dll函数为:<br>voidWINAPISmg(HANDLEm_hwd,DWORDMYMESSAGE)<br>{<br>PostMessage(m_hwd,MYMESSAGE,0,0);<br>}<br>在def文件中定义<br>LIBRARYISA_DLL.dll<br><br>EXPORTS<br><br><br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在上层MFC调用程序头文件声明函数<br>typedefvoid(WINAPI*ADDPROC_3)(HANDLEm_hwd,ULONGWM_MYMESSAGE);<br>上层调用<br>HINSTANCEhInst;<br>hInst=LoadLibrary("ISA_DLL.dll");<br>ADDPROC_3ISA_Smg=(ADDPROC_3)GetProcAddress(hInst,"Smg");<br>ISA_Smg(m_hWnd,WM_MYMESSAGE);<br>这个调用应该放哪呢?
答:>我现在就是什么都不做,就是直接调用dll函数发送一个消息到上层<br>dll函数为:<br>voidWINAPISmg(HANDLEm_hwd,DWORDMYMESSAGE)<br>{<br>PostMessage(m_hwd,MYMESSAGE,0,0);<br>}<br>在def文件中定义<br>LIBRARYISA_DLL.dll<br><br>EXPORTS<br><br><br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在上层MFC调用程序头文件声明函数<br>typedefvoid(WINAPI*ADDPROC_3)(HANDLEm_hwd,ULONGWM_MYMESSAGE);<br>上层调用<br>HINSTANCEhInst;<br>hInst=LoadLibrary("ISA_DLL.dll");<br>ADDPROC_3ISA_Smg=(ADDPROC_3)GetProcAddress(hInst,"Smg");<br>ISA_Smg(m_hWnd,WM_MYMESSAGE);<br>这个调用应该放哪呢?m_hWnd就是我想传下去的窗口句柄!
答:>不是这么玩的,你要写个消息映射函数。
答:>句柄和message都有了,exe没必要调用dll来做发消息的事
答:>恩,消息映射函数也写了啊,因为只是测试是否成功,所以写的很简单<br>voidCTestView::OnMyMessage(WPARAMw,LPARAMl)<br>{<br>MessageBox("howareyou");<br>}<br>
答:>恩,调用这个dll不只是发送消息,实际是调用一个接收数据函数,希望接受完一帧数据的时候向上层发送一个消息,而在这里我就是试一下单机调试发送消息是否成功,直接在接收函数里面发送消息函已经做好了一个驱动调用的DLL函数,在里面一个子程序是当接收完数据是通过事件响应告诉上层数据接受完毕,我自己编了一个WIN32的测试程序是可以通过的,但是老师要用DELPHI来调用,希望是给上层窗口一个消息,我就自己生成一个MFC单文档来测试,那在MFC中应该在哪块加载dll,并且获取函数指针,并且在下层的dll函数中如何向上层发送这个消息?直接用SendMessage或者PostMessage发送,在得到窗口指针和消息号的情况下(通过上层调用传递这两个参数?),同时在MFC中自己添加这个消息响应机制!
答:>exe向dll传入句柄,双方协议一个自定义消息
答:>MFC的话,可以直接用SendMessage,发送WM_COPYDATA消息,界面可以重写OnCopyData。
答:>dll不是MFC的,就是win32的,我现在就是什么都不做,就是直接调用dll函数发送一个消息到上层<br>dll函数为:<br>voidWINAPISmg(HANDLEm_hwd,DWORDMYMESSAGE)<br>{<br>PostMessage(m_hwd,MYMESSAGE,0,0);<br>}<br>在def文件中定义<br>LIBRARYISA_DLL.dll<br><br>EXPORTS<br><br><br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在上层MFC调用程序头文件声明函数<br>typedefvoid(WINAPI*ADDPROC_3)(HANDLEm_hwd,ULONGWM_MYMESSAGE);<br>上层调用<br>HINSTANCEhInst;<br>hInst=LoadLibrary("ISA_DLL.dll");<br>ADDPROC_3ISA_Smg=(ADDPROC_3)GetProcAddress(hInst,"Smg");<br>ISA_Smg(m_hWnd,WM_MYMESSAGE);<br>这个调用应该放哪呢?
答:>我现在就是什么都不做,就是直接调用dll函数发送一个消息到上层<br>dll函数为:<br>voidWINAPISmg(HANDLEm_hwd,DWORDMYMESSAGE)<br>{<br>PostMessage(m_hwd,MYMESSAGE,0,0);<br>}<br>在def文件中定义<br>LIBRARYISA_DLL.dll<br><br>EXPORTS<br><br><br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在上层MFC调用程序头文件声明函数<br>typedefvoid(WINAPI*ADDPROC_3)(HANDLEm_hwd,ULONGWM_MYMESSAGE);<br>上层调用<br>HINSTANCEhInst;<br>hInst=LoadLibrary("ISA_DLL.dll");<br>ADDPROC_3ISA_Smg=(ADDPROC_3)GetProcAddress(hInst,"Smg");<br>ISA_Smg(m_hWnd,WM_MYMESSAGE);<br>这个调用应该放哪呢?m_hWnd就是我想传下去的窗口句柄!
答:>不是这么玩的,你要写个消息映射函数。
答:>句柄和message都有了,exe没必要调用dll来做发消息的事
答:>恩,消息映射函数也写了啊,因为只是测试是否成功,所以写的很简单<br>voidCTestView::OnMyMessage(WPARAMw,LPARAMl)<br>{<br>MessageBox("howareyou");<br>}<br>
答:>恩,调用这个dll不只是发送消息,实际是调用一个接收数据函数,希望接受完一帧数据的时候向上层发送一个消息,而在这里我就是试一下单机调试发送消息是否成功,直接在接收函数里面发送消息函数需要在插有板子的机器上测试!
答:><fieldset><legend>引用1楼ouyh12345的回复:</legend><br>exe向dll传入句柄,双方协议一个自定义消息<br></fieldset><br><br>dll导出一个接口,用来接收句柄<br>需要时,向这个句柄发自定义消息
答:>什么意思?dll是导出一些函数接口啊<br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在调用其中某个函数的时候不可以直接把窗口句柄传下去?<br>在这个函数执行完成的时候再利用传下来的参数(句柄和消息号)用SendMessage发送消息?
答:>调用dll的接口,然后在dll的接口函数里向本exe发消息?<br>逻辑上就不对
答:>谢谢一直关注啊,那应该是怎样的一个思路啊?<br>我的想法是调用dll接口来打开接受函数的中断,而下层驱动在等待中断来接受函数,当接受完一帧数据时,给上层说我接受完了,由上层来取出缓冲区中的数据
答:>dll另开线程来接收,接收完后,向exe发消息,带上数据作为参数
答:>我最初是用事件实现的,并且调试是可以成功的<br>RecvEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//创建接受发送完毕事件<br>WaitForSingleObject(RecvEvent,INFINITE);//等待接收中断,返回则一帧数据接收完毕<br>而下层通过SetEvent(RecvEvent);通知上层<br>
数需要在插有板子的机器上测试!
答:><fieldset><legend>引用1楼ouyh12345的回复:</legend><br>exe向dll传入句柄,双方协议一个自定义消息<br></fieldset><br><br>dll导出一个接口,用来接收句柄<br>需要时,向这个句柄发自定义消息
答:>什么意思?dll是导出一些函数接口啊<br>CSD_SetEvent@1<br>Send@2<br>Smg@3<br>在调用其中某个函数的时候不可以直接把窗口句柄传下去?<br>在这个函数执行完成的时候再利用传下来的参数(句柄和消息号)用SendMessage发送消息?
答:>调用dll的接口,然后在dll的接口函数里向本exe发消息?<br>逻辑上就不对
答:>谢谢一直关注啊,那应该是怎样的一个思路啊?<br>我的想法是调用dll接口来打开接受函数的中断,而下层驱动在等待中断来接受函数,当接受完一帧数据时,给上层说我接受完了,由上层来取出缓冲区中的数据
答:>dll另开线程来接收,接收完后,向exe发消息,带上数据作为参数
答:>我最初是用事件实现的,并且调试是可以成功的<br>RecvEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//创建接受发送完毕事件<br>WaitForSingleObject(RecvEvent,INFINITE);//等待接收中断,返回则一帧数据接收完毕<br>而下层通过SetEvent(RecvEvent);通知上层<br>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多