Как добавить событие в проект C++/WinRt?

В настоящее время я работаю над C++/WinRt, который подключается (отправитель) к одному из доступных устройств (клиент) в определенном регионе с помощью WifiDirect. Когда устройство хочет подключиться, оно отправляет отправителю запрос на подключение. Отправитель должен обнаружить запрос на подключение, отправленный клиентом, и подключиться к клиенту. Для этого мне нужно добавить событие - (Запрошенное соединение). Как только я добавлю, он должен выполнить код OnConnectionRequested.

#include "pch.h"
#include <winrt/Windows.Foundation.Collections.h>
#include "winrt/Windows.Devices.WiFiDirect.h"
#pragma once
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::Devices::WiFiDirect;
using namespace Windows::Storage::Streams;
using namespace winrt::Windows::Devices::WiFiDirect;
using namespace winrt::Windows::Devices::Enumeration;
enum class NotifyType
{
    StatusMessage,
    ErrorMessage
};
enum class CallbackContext
{
    Any,
    Same
};
class st
{
public:
    void OnConnectionRequested(WiFiDirectConnectionListener sender,
                               WiFiDirectConnectionRequestedEventArgsconnection EventArgs)
    {
        WiFiDirectConnectionRequest connectionRequest = connectionEventArgs.GetConnectionRequest();
        printf("Connection request received from ", connectionRequest.DeviceInformation().Name(), "Connection Request");
        printf("Connecting to ", connectionRequest.DeviceInformation().Name(), NotifyType::StatusMessage);
    }
    
    void start()
    {
        Windows::Devices::WiFiDirect::WiFiDirectAdvertisementPublisher _publisher;
        Windows::Devices::WiFiDirect::WiFiDirectConnectionListener _listener;
        winrt::event_token _connectionRequestedToken;
    
        try
        {
            _connectionRequestedToken = _listener.ConnectionRequested({this, &st::OnConnectionRequested});
            _publisher.Start();
            printf("Advertisement started, waiting for StatusChangedcallback...", NotifyType::StatusMessage);
        }
        catch (...)
        {
            printf("Error starting Advertisement: ", NotifyType::ErrorMessage);
        }

        getchar();
    }
};
int main()
{
    st s;
    s.start();
}

Это правильный способ добавить событие в C++/WinRt:

_connectionRequestedToken = _listener.ConnectionRequested({this, &st::OnConnectionRequested});

Ошибки:

LNK1120 1 неразрешенные внешние файлы — ошибка в файле Winrt.exe

Неразрешенный внешний символ LNK2019 @QBE?AUhstring@3@XZ), на который ссылается функция public: void __thiscall st::OnConnectionRequested(struct winrt::Windows::Devices::WiFiDirect::WiFiDirectConnectionListener,struct winrt::Windows::Devices::WiFiDirect::WiFiDirectConnectionRequestedEventArgs ) (?OnConnectionRequested@st@@QAEXUWiFiDirectConnectionListener@WiFiDirect@Devices@Windows@winrt@@UWiFiDirectConnectionRequestedEventArgs@3456@@Z) - ошибка в Program.obj 1

Какие изменения я должен сделать в этой строке, чтобы устранить ошибку? Что на самом деле означает ошибка? Или есть другой способ добавить событие в проект C++/WinRt?


person Vismaya    schedule 15.02.2020    source источник


Ответы (1)


Вам не хватает директивы #include:

#include <winrt/Windows.Devices.Enumeration.h>

См. Почему компоновщик выдает ошибку "LNK2019: неразрешенный внешний символ"?:

Если неразрешенный символ представляет собой API из заголовков пространства имен Windows для проекции C++/WinRT (в пространстве имен winrt), то API объявляется в заголовке, который вы включили, но его определение находится в заголовке, который вы еще не включал. Включите заголовок, названный для пространства имен API, и перестройте. Для получения дополнительной информации см. заголовки проекций C++/WinRT.

Общие инструкции по обработке событий см. в разделе Обрабатывать события с помощью делегатов в C++/WinRT.


Захват this (необработанный указатель) в делегате также может быть опасным. Это разрывает связь между временем существования объекта и видимостью и возлагает на вас бремя управления временем жизни. См. Безопасный доступ к этому указателю с делегатом обработки событий для более безопасных и управляемых альтернатив.

person Bernd36    schedule 18.02.2020