所以,真正的问题是你不明白如何在 C++ 中调用TMessageManager::SubscribeToMessage()。您应该从阅读文档开始,其中包括 C++ 示例。
Sending and Receiving Messages Using the RTL.
Brian Long's Delphi example 在 C++ 中将转换为以下内容:
#include <System.Messaging.hpp>
//...
class TMainForm : public TForm
{
//...
private:
static const int ScanRequestCode = 0;
int FMessageSubscriptionID;
void __fastcall HandleActivityMessage(TObject* const Sender, TMessageBase* const M);
bool __fastcall OnActivityResult(int RequestCode, int ResultCode, _di_JIntent Data);
//...
};
#include <FMX.Platform.Android.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.App.hpp>
#include <Androidapi.JNI.Toast.hpp>
#include <LaunchActivities.hpp>
// ...
void __fastcall TMainForm::BarcodeScannerButtonClick(TObject *Sender)
{
FMessageSubscriptionID = TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageResultNotification), &HandleActivityMessage);
LaunchQRScanner(ScanRequestCode);
}
void __fastcall TMainForm::HandleActivityMessage(TObject* const Sender, TMessageBase* const M)
{
TMessageResultNotification *msg = dynamic_cast<TMessageResultNotification*>(M);
if (msg)
OnActivityResult(msg->RequestCode, msg->ResultCode, msg->Value);
}
bool __fastcall TMainForm::OnActivityResult(int RequestCode, int ResultCode, _di_JIntent Data)
{
String ScanContent, ScanFormat;
TMessageManager::DefaultManager->Unsubscribe(__classid(TMessageResultNotification), FMessageSubscriptionID);
FMessageSubscriptionID = 0;
// For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
if (RequestCode == ScanRequestCode)
{
if (ResultCode == TJActivity::JavaClass->RESULT_OK)
{
if (Data)
{
ScanContent = JStringToString(Data->getStringExtra(StringToJString("SCAN_RESULT")));
ScanFormat = JStringToString(Data.getStringExtra(StringToJString("SCAN_RESULT_FORMAT")));
Toast(Format("Found %s format barcode:\n%s", ARRAYOFCONST(( ScanFormat, ScanContent ))), LongToast);
}
}
else if (ResultCode == TJActivity::JavaClass->RESULT_CANCELED)
{
Toast("You cancelled the scan", ShortToast);
}
return true;
}
return false;
}