讨论:动态链接库如何给主程序发送自定义消息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讨论:动态链接库如何给主程序发送自定义消息?相关的知识,希望对你有一定的参考价值。

一个dll动态链接库,希望在内部给调用它的主程序发送自定义消息,尝试使用sendmessage发送,总是不成功。请各位高手说说想法!讨论为主,分不够可以加!
消息是主程序中定义的,想通过从dll中发送消息让主程序执行一些操作。

1、向窗口可以通过SendMessage()/PostMessage() API来发送消息。
2、向主程序线程可以通过PostThreamdMessage() API来发送消息。

API中的WPARAM/ LPARAM 参数基本上可以通过强转成任意类型的指针,具体应用就看你的需求了。 但是在发送/响应消息需要注意几点:
1、需要等待消息返回结果的话,需要用SendMessage() API,不能采用PostMessage() API。
2、如果动态库不需要等待返回结果,只是发送简单类型数据(比如int /char)等,可以直接PostMessage() API发送。 对于复杂类型,比如结构之类的,可以将结构地址指针强转成LPARAM参数类型进行发送,但是需要注意: 如果是结构变量在栈上,你不能采用PostMessage() 来发送, 因为PostMessage() 是异步发送的, 当主程序接收到消息时,可能结构的内存已经在栈上释放或覆盖,导致接收的数据为垃圾数据。可以通过SendMessage()/ReplyMessage()组合完成。
3、当动态库发送的结构/指针在堆上, 且由动态库中new/malloc的分配的内存, 需要在主程序释放时, 要注意动态库编译类型如果是采用/MT编译的,则需要动态库来释放,或由动态库导出释放内存接口供主程序显式调用释放,不然会产生跨模块释放内存的问题,很容易产生一些莫名其妙的崩溃。
参考技术A 这个简单啊,在主程序调入DLL后,再调用DLL输出的一个函数,传递过去主程序的窗口句柄及通知用的消息。之后DLL就可以利用来向主程序发出消息。 参考技术B 这种情况我是遇过的。我遇的问题是SOCKET 通信问题。

你在调用DLL 的同时,将调用者的对像指针传递过去。这样就解决了所有的问题了。而你的DLL里只需要多保存一个变量就行了。

在你需要的时候,直接就可以用SendMessage, 就可以了。
你试试看。
参考技术C //假如在一个公共的头文件里定义这个消息。
#define WM_TEST (WM_USER + 100)
给你一段代码吧,也许会有用,你必须在发送消息之前向DLL注册主窗口句柄。而这个注册函数能否顺利的调用则表明了你的DLL是否已经加载成功。
void __declspec(dllexport) registerMainHandle(HWND hWnd)

AfxMessageBox("Dll loaded successfully!");
ASSERT(hWnd); //你的hWnd是否有效?
…… //保存主窗口句柄
//向主程序传递一个参数1000
::SendMessage(hWnd, WM_TEST, 1000, 0);
参考技术D 1.如果是自己的主程序和自己的DLL

那么就很简单了 自己协调一下

比如使用特定的标题或窗口类名

使得FindWindow函数可以一次找到那个窗口

然后就可以发消息了

也可以在DLL中导出一个函数用于注册主程序窗口句柄

形如VOID __stdcall RegisterSelf(HWND hWindow);

在DLL中使用一个变量保存住就可以了

2.如果不是自己的主程序,是自己的DLL

这样就不容易协调了

如果有很好的窗口特征仍然可以使用FindWindow函数搞定

如果没有这些特征,可以使用枚举窗口的办法

在DllMain中使用GetCurrentProcessId函数得到进程id

枚举所有前台窗口,用GetWindowThreadProcessId函数得到进程ID

对比两个ID,相同即表示找到了

然后可以发送消息

3.不是自己的主程序,也不是自己的DLL

这样的情况貌似没有什么意义了

但是可以使用DLL函数转发设计一个自己的DLL替换原来的DLL

这样就又由你自己了本回答被提问者采纳

推送通知消息自定义?

【中文标题】推送通知消息自定义?【英文标题】:Push notification message customization? 【发布时间】:2016-06-28 12:21:21 【问题描述】:

我正在开发聊天应用程序。每当有人向我发送消息时,我都会收到带有文本“A 向您发送消息”的推送通知。但有时我会收到带有文本“您有 4 条新消息”的推送。(4 是可变数字)。服务器团队声称他们没有发送此类消息。只是想知道苹果是否在任何情况下自定义消息。

【问题讨论】:

【参考方案1】:

不,Apple 不这样做。

它必须是您的服务器开发人员或他们用来发送推送通知的第三方库。

【讨论】:

服务器正在使用 azure 的服务。你认为 Azure 可能会这样做吗? 我还没有接触 Azure,但有可能。

以上是关于讨论:动态链接库如何给主程序发送自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章

Mailchimp - 如何创建段的自定义段

ios 本地工程加载自定义动态库时,需要对动态库进行签名吗

iOS-如何使用自定义参数firebase获取动态短链接

如何从用户应用程序向系统应用程序发送自定义消息?

LLINUX GCC 编译C使用自定义动态链接库.so的问题

推送通知消息自定义?