【问题标题】:MySQL User Defined Function to send a windows messageMySQL用户定义函数发送windows消息
【发布时间】:2011-04-28 09:08:42
【问题描述】:

节日,

我想在 MySQL 5.1.51 (XP SP3) 上的 MySQL UDF 中使用 Windows API Postmessage() 调用。我知道 UDF(用 Delphi 2006 编写)通过为 UDF 设置虚假结果来工作。

UDF 的语法采用两个整数参数,一个用于窗口句柄,另一个用于消息编号。但是,从我的 UDF 内部调用 PostMessage() 会导致 mysqld 中出现异常并且服务停止。

有什么想法或建议吗?或者,如果有人能告诉我如何通过 AnyDAC 和 Delphi 模拟 MySQL 的 IB 事件,或者当数据库中的记录发生更改时获取通知的替代方法,那么请告诉我。

--多诺万

【问题讨论】:

  • 如果您发布您遇到的异常情况会有所帮助...
  • 您是否将 MySQL 作为服务运行?如果您这样做,我认为它不会访问您的桌面窗口。我不认为它应该崩溃。此外,Delphi 似乎是一种用于编写 MySQL UDF 的奇怪语言。
  • 欢迎来到 Stack Overflow。您的最后一段询问如何在 MySQL 中模拟 Interbase 事件。如果这真的是你想要的,那么问一个单独的问题。不要把它埋在关于未指定异常的问题中。
  • 是的,我将 MySQL 作为服务运行。我没有任何例外。我收到 Microsoft 的“此应用程序遇到错误,需要关闭”。事件日志显示:EventID: 1000 Category (100) Faulting application mysqld.exe, version 0.0.0.0, faulting module kernel32.dll, version 5.1.2600.5781, fault address 0x00012afb。
  • @user223742 尝试不要将其作为服务运行。

标签: mysql delphi user-defined-functions


【解决方案1】:

您在使用这种方法时会遇到问题,主要是因为消息传递仅适用于相同的访问级别,并且只能在同一台计算机上的同一会话中工作。使用其他方法会更好地为您服务,例如 TCPIP 套接字、MailSlots、内存映射文件等。

为了最好地模拟帖子消息,我会使用TCPIP UDP。我过去使用过的一个很好的轻量级库是Synapse。来自 SVN 的突触库在最新版本的 Delphi 上运行良好。您要为此使用的类是 TUDPBlockSocket。

【讨论】:

  • 好的。那么接下来的问题就是UDF是否会在_init中打开socket,然后在_deinit中关闭。
  • 我会做一个懒惰的创造。在需要触发事件之前您不需要它,因此请创建它。在 _deinit 检查是否创建了一个套接字,如果是则销毁它。保持简单。 UDP 是一种即发即弃的协议。您不必等待并听取响应。
【解决方案2】:

作为 Windows 消息或 TCP/IP 的替代方案,您可能需要考虑 named pipesthis question on sending information between two Delphi programsthis question on what named pipes are 的回答。

--杰罗恩

【讨论】:

  • 感谢 Jeroen,这是我最终采用的解决方案。编写了一个自定义 UDF,如果它与 DB 服务器在同一台机器上运行,则通过 Windows 管道将信息发送到应用程序本身,或者发送到一个简单的套接字服务器应用程序以通过 TCP 分发它。 ——多诺万
  • 酷!很高兴我能帮上忙。
【解决方案3】:

虽然我通过 UDF / Windows Pipe 路由取得了成功,但我有了另一个想法,那就是利用 MySQL 中的信息消息框架(?)。见https://stackoverflow.com/q/3992779/223742

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多