Как добавить событие в проект C ++ / WinRt? - PullRequest
0 голосов
/ 15 февраля 2020

В настоящее время я работаю над C ++ / WinRt, который подключает (Отправитель) к одному из доступных устройств (Клиент) вокруг указанного c региона с помощью 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 неразрешенный внешний символ "publi c: struct winrt :: hstring __thiscall winrt :: impl :: consumer_Windows_Devices_Enumeration_IDeviceInformation :: Name (void) const "(? Name @? $consume_Windows_Devices_Enumeration_IDeviceInformation@UIDeviceInformation@Enumeration@Devices@Windows@winrt@@@impl@winrt@@QBE? AUhstring@3@XZ), на который ссылается функция" publi c: 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?

1 Ответ

2 голосов
/ 18 февраля 2020

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

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

См. Почему компоновщик выдает мне ошибку "LNK2019: Unresolved external symbol"? :

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

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


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

...