【问题标题】:WM_COPYDATA without a class in Delphi在 Delphi 中没有类的 WM_COPYDATA
【发布时间】:2012-11-15 10:00:30
【问题描述】:

我想发送/接收来自 2 个 CONSOLE 应用程序的字符串(2 个没有表单的不同 PID!)。我看到我需要在一个类中声明这个。是否可以在控制台应用程序中完全没有类的情况下做到这一点?如果是这样,我该怎么做?

感谢您的帮助。

【问题讨论】:

  • 看看 WM_COPYDATA 中的 WM,它是从 WindowMessage 构建的。所以它实际上是一个发送到窗口的消息。但不仅 TForm 是一个窗口。您在显示器上看到的几乎所有内容都基于窗口。这就是为什么 MS 将他们的产品称为 Windows ;o)

标签: delphi wm-copydata


【解决方案1】:

如果没有将其发送到的窗口,您将无法使用 WM_COPYDATA。如果不使用类,则必须直接使用 Win32 API RegisterClass()CreateWindow/Ex() 函数来分配窗口并为其消息处理程序提供自己的独立函数。

但是为什么不使用类呢?然后,您可以利用 RTL 的内置消息处理程序系统。至少,您可以将AllocateHWnd() 与静态类方法一起使用,这样您就不必在运行时实例化类对象,例如:

type
  TWindowMessages = class
  public
    class procedure WndProc(var Message: TMessage);
  end;

class procedure TWindowMessages.WndProc(var Message: TMessage);
begin
  //...
end;

var
  Wnd: HWND;

Wnd := AllocateHWnd(TWindowMessages.WndProc);
// pump the message queue for new messages as needed...
DeallocateHWnd(Wnd);

如果这不能满足你的需求,那么你应该考虑一种不依赖于windows的不同IPC机制,比如命名管道、邮槽、套接字等。

【讨论】:

  • 次要的挑剔。那不是静态类方法。静态类方法没有隐式 Self 参数。通过在声明的末尾添加 static 来创建静态类方法。这是一个类方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多