【发布时间】:2023-04-04 01:11:01
【问题描述】:
我正在使用 C++Builder 10.2。
在 Android 中,我想从各种线程(包括主线程)向主 GUI 线程发送消息。在 Windows 中,我可以发布消息并将 LPARAM 或 WPARAM 分配给结构或类的某个实例的地址。
我正在尝试使用System.Messaging.TMessageManager 来做同样的事情,类似于这里的示例:System.Messaging (C++)。但我只能发送“简单”类型,例如UnicodeString 或int。我还没有弄清楚如何发送指针,假设它甚至是可能的。
我想发送一个这样的结构/类实例:
class TSendResult
{
public:
String Message;
unsigned int Value;
int Errno;
__fastcall TSendResult(void);
__fastcall ~TSendResult();
};
如果可以,我该怎么写?我设法得到一个版本来编译,但得到一个链接器错误:
错误:未定义对'vtable for System::Messaging::TMessage__1
'的引用
表单构造函数:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMetaClass* MessageClass = __classid(TMessage__1<TSendResult>);
TMessageListenerMethod ShowReceivedMessagePointer = &(this->MMReceiveAndCallBack);
MessageManager->SubscribeToMessage(MessageClass, ShowReceivedMessagePointer);
}
按钮点击处理程序:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
...
TSendResult *SPtr = new TSendResult();
SPtr->Message = "All good";
SPtr->Value = 10;
SPtr->Errno = 0;
TMessageManager* MessageManager = TMessageManager::DefaultManager;
TMessage__1<TSendResult>* Message = new TMessage__1<TSendResult>(*SPtr); // <-- this doesn't look right...
MessageManager->SendMessage(Sender, Message, false);
}
捕获消息的函数:
void __fastcall TForm1::MMReceiveAndCallBack(System::TObject* const Sender,
System::Messaging::TMessageBase* const M)
{
TMessage__1<TSendResult>* Message = dynamic_cast<TMessage__1<TSendResult>*>(M);
if (Message) {
ShowMessage(Message->Value.Message);
}
}
【问题讨论】:
标签: android c++ c++builder