Win32 uygulamasında akış sağlayıcısı uygulama (C++/WinRT)

Uyarı

Bazı bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen, önceden yayımlanan ürünle ilgilidir. Microsoft, burada sağlanan bilgilerle ilgili olarak açık veya zımni hiçbir garanti vermez.

Bu makalede, bir akış içeriği URI'sini kaydeden ve IFeedProvider arabirimini uygulayan basit bir akış sağlayıcısı oluşturma işleminde size yol gösterilir. Bu arabirimin yöntemleri, genellikle kimlik doğrulama senaryolarını desteklemek üzere özel sorgu dizesi parametreleri istemek için Pencere Öğeleri Panosu tarafından çağrılır. Akış sağlayıcıları tek bir akışı veya birden çok akışı destekleyebilir.

C++/WinRT kullanarak bir akış sağlayıcısı uygulamak için bkz. C# Windows uygulamasında (C++/WinRT) akış sağlayıcısı uygulama.

Önkoşullar

  • Cihazınızda geliştirici modu etkinleştirilmiş olmalıdır. Daha fazla bilgi için bkz. Geliştiriciler için ayarlar.
  • WinUI uygulama geliştirme iş yüküyle Visual Studio 2026 veya üzeri. İsteğe bağlı açılan listeden C++ (v143) bileşenini eklediğinizden emin olun.

Yeni bir C++/WinRT win32 konsol uygulaması oluşturma

Visual Studio'da yeni bir proje oluşturun. Yeni bir proje oluştur iletişim kutusunda, dil filtresini "C++" ve platform filtresini Windows olarak ayarlayın, ardından Windows Konsol Uygulaması (C++/WinRT) proje şablonunu seçin. Yeni projeyi "ExampleFeedProvider" olarak adlandırın. Bu izlenecek yol için Çözümü ve projeyi aynı dizine yerleştir seçeneğinin işaretlenmemiş olduğundan emin olun. İstendiğinde, uygulamanın hedef Windows sürümünü 10.022631.2787 veya üzeri olarak ayarlayın.

Windows Uygulama SDK'sı ve Windows Uygulama Kitaplığı NuGet paketlerine başvuru ekleme

Bu örnek en son kararlı Windows Uygulama SDK'sı NuGet paketini kullanır. Çözüm Gezgini Başvurular'a sağ tıklayın ve NuGet paketlerini yönet...seçin. NuGet paket yöneticisinde Gözat sekmesini seçin ve "Microsoft.WindowsAppSDK" araması yapın. Sürüm açılan listesinden en son kararlı sürümü seçin ve ardından Yüklebutonuna tıklayın.

Bu örnek, Windows Uygulama Kitaplığı NuGet paketini de kullanır. Çözüm Gezgini Başvurular'a sağ tıklayın ve NuGet paketlerini yönet...seçin. NuGet paket yöneticisinde Gözat sekmesini seçin ve "Microsoft.Windows.ImplementationLibrary" araması yapın. Sürüm açılan listesinden en son sürümü seçin ve Yükleöğesine tıklayın.

Önceden derlenmiş başlık dosyası pch.h'ye aşağıdaki ekleme yönergelerini ekleyin.

//pch.h 
#pragma once
#include <wil/cppwinrt.h>
#include <wil/resource.h>
...
#include <winrt/Microsoft.Windows.Widgets.Providers.h>

Uyarı

WinRT üst bilgilerinden önce wil/cppwinrt.h üst bilgisini eklemeniz gerekir.

Akış sağlayıcısı uygulamasının doğru şekilde kapatılmasını işlemek için winrt::get_module_lock özel bir uygulamasına ihtiyacımız vardır. main.cpp dosyamızda tanımlanacak signalLocalServerShutdown yöntemini önceden bildiririz ve uygulamanın çıkışını belirten bir olay ayarlarız. Aşağıdaki kodu, diğer dahil etmelerden önce, #pragma once yönergesinin hemen altına pch.h dosyanıza ekleyin.

//pch.h
#include <stdint.h>
#include <combaseapi.h>

// In .exe local servers the class object must not contribute to the module ref count, and use
// winrt::no_module_lock, the other objects must and this is the hook into the C++ WinRT ref counting system
// that enables this.
void SignalLocalServerShutdown();

namespace winrt
{
    inline auto get_module_lock() noexcept
    {
        struct service_lock
        {
            uint32_t operator++() noexcept
            {
                return ::CoAddRefServerProcess();
            }

            uint32_t operator--() noexcept
            {
                const auto ref = ::CoReleaseServerProcess();

                if (ref == 0)
                {
                    SignalLocalServerShutdown();
                }
                return ref;
            }
        };

        return service_lock{};
    }
}


#define WINRT_CUSTOM_MODULE_LOCK

Akış işlemlerini işlemek için Bir FeedProvider sınıfı ekleme

Visual Studio'da, Çözüm Gezgini menüsünden projeye sağ tıklayın veSınıfekle-seçeneğini seçin. Sınıf ekle iletişim kutusunda sınıfı "FeedProvider" olarak adlandırın ve Ekle'ye tıklayın.

IFeedProvider arabirimini uygulayan bir sınıf bildirme

IFeedProvider arabirimi, Pencere Öğeleri Panosunun akış sağlayıcısıyla işlemleri başlatmak için çağıracağı yöntemleri tanımlar. FeedProvider.h dosyasındaki boş sınıf tanımını aşağıdaki kodla değiştirin. Bu kod , IFeedProvider arabirimini uygulayan bir yapı bildirir ve arabirim yöntemleri için prototipler bildirir.

// FeedProvider.h
#pragma once
struct FeedProvider : winrt::implements<FeedProvider, winrt::Microsoft::Windows::Widgets::Feeds::Providers::IFeedProvider>
{
    FeedProvider() {}

    /* IFeedProvider required functions that need to be implemented */
    void OnFeedProviderEnabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedProviderEnabledArgs args);
    void OnFeedProviderDisabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedProviderDisabledArgs args);
    void OnFeedEnabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedEnabledArgs args);
    void OnFeedDisabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedDisabledArgs args);
    void OnCustomQueryParametersRequested(winrt::Microsoft::Windows::Widgets::Feeds::Providers::CustomQueryParametersRequestedArgs args);
    /* IFeedProvider required functions that need to be implemented */

};

IFeedProvider yöntemlerini uygulama

Sonraki birkaç bölümde IFeedProvider arabiriminin yöntemlerini uygulayacağız. Arabirim yöntemlerine geçmeden önce, önceki adımda bildirdiğimiz haritaya erişime izin vermek ve akış sağlayıcısı API'lerini FeedProvider.cpp ad alanına çekmek için ekleme yönergelerinden sonra öğesine aşağıdaki satırları ekleyin.

Uyarı

IFeedProvider arabiriminin geri çağırma yöntemlerine geçirilen nesnelerin yalnızca geri çağırma içinde geçerli olacağı garanti edilir. Geri çağırma bağlamı dışındaki davranışları tanımsız olduğundan, bu nesnelere yönelik başvuruları depolamamalısınız.

// FeedProvider.cpp
namespace winrt
{
    using namespace Microsoft::Windows::Widgets::Feeds::Providers;
}

Besleme Sağlayıcısı Etkinleştirildi

Sağlayıcıyla ilişkilendirilmiş bir akış Pencere Öğeleri Panosu konağı tarafından oluşturulduğunda OnFeedProviderEnabled yöntemi çağrılır. Bu yöntemin uygulanmasında, gerekli kimlik doğrulama belirteçleri dahil olmak üzere akış içeriğini sağlayan URL'ye geçirilecek parametreleri içeren bir sorgu dizesi oluşturun. Etkinleştirilen akışı ve sorgu dizesini tanımlayan olay args dosyasından FeedProviderDefinitionId değerini geçirerek CustomQueryParametersUpdateOptions örneğini oluşturun. Varsayılan FeedManager'ı alın ve Sorgu dizesi parametrelerini Pencere Öğeleri Panosu'na kaydetmek için SetCustomQueryParameters'ı çağırın.

// FeedProvider.cpp
void FeedProvider::OnFeedProviderEnabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedProviderEnabledArgs args)
{
    std::wstringstream wstringstream;
wstringstream << args.FeedProviderDefinitionId().c_str() << L" feed provider was enabled." << std::endl;
    _putws(wstringstream.str().c_str());

    auto updateOptions = winrt::CustomQueryParametersUpdateOptions(args.FeedProviderDefinitionId(), L"param1&param2");
    winrt::FeedManager::GetDefault().SetCustomQueryParameters(updateOptions);
}

Besleme Sağlayıcısı Devre Dışı

OnFeedProviderDisabled, sağlayıcının tüm akışları devre dışı bırakıldığında Pencere Öğeleri Panosu tarafından çağrılır. Bu yöntem çağrısına yanıt olarak akış sağlayıcılarının herhangi bir eylem gerçekleştirmesi gerekmez. Yöntem çağırma telemetri amacıyla veya sorgu dizesi parametrelerini güncelleştirmek veya gerekirse kimlik doğrulama belirteçlerini iptal etmek için kullanılabilir. Eğer uygulama yalnızca tek bir akış sağlayıcısını destekliyorsa veya uygulamanın desteklediği tüm akış sağlayıcıları devre dışı bırakıldıysa, bu geri çağırmaya yanıt olarak uygulama çıkabilir.

// FeedProvider.cpp

void FeedProvider::OnFeedProviderDisabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedProviderDisabledArgs args)
{
    std::wstringstream wstringstream;
    wstringstream << args.FeedProviderDefinitionId().c_str() << L" feed provider was disabled." << std::endl;
    _putws(wstringstream.str().c_str());
}

YayınAçıkken, YayınKapalıyken

Bir akış etkinleştirildiğinde veya devre dışı bırakıldığında, Pencere Öğeleri Panosu tarafından OnFeedEnabled ve OnFeedDisabled çağrılır. Akış sağlayıcılarının bu yöntem çağrılarına yanıt olarak herhangi bir eylem gerçekleştirmesi gerekmez. Yöntem çağırma telemetri amacıyla veya sorgu dizesi parametrelerini güncelleştirmek veya gerekirse kimlik doğrulama belirteçlerini iptal etmek için kullanılabilir.

// FeedProvider.cpp

void FeedProvider::OnFeedEnabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedEnabledArgs args)
{
    std::wstringstream wstringstream;
    wstringstream << args.FeedDefinitionId().c_str() << L" feed was enabled." << std::endl;
    _putws(wstringstream.str().c_str());
}
// FeedProvider.cpp

void FeedProvider::OnFeedDisabled(winrt::Microsoft::Windows::Widgets::Feeds::Providers::FeedDisabledArgs args)
{
    std::wstringstream wstringstream;
    wstringstream << args.FeedDefinitionId().c_str() << L" feed was disabled." << std::endl;
    _putws(wstringstream.str().c_str());
}

ÖzelSorguParametreleriİstendiğinde

OnCustomQueryParametersRequested, Pencere Öğeleri Panosu, akış sağlayıcısıyla ilişkili özel sorgu parametrelerinin yenilenmesi gerektiğine karar verdiğinde tetiklenir. Örneğin, uzak web hizmetinden akış içeriği getirme işlemi başarısız olursa bu yöntem tetiklenebilir. Bu yönteme geçirilen CustomQueryParametersRequestedArgs'inFeedProviderDefinitionId özelliği, sorgu dizesi parametrelerinin istendiği akışı belirtir. Sağlayıcı sorgu dizesini yeniden oluşturmalı ve SetCustomQueryParameters çağırarak Widgets Panosu'na geri geçirmelidir.

// FeedProvider.cpp

void FeedProvider::OnCustomQueryParametersRequested(winrt::Microsoft::Windows::Widgets::Feeds::Providers::CustomQueryParametersRequestedArgs args)
{
    std::wstringstream wstringstream;
    wstringstream << L"CustomQueryParameters were requested for " << args.FeedProviderDefinitionId().c_str() << std::endl;
    _putws(wstringstream.str().c_str());

    auto updateOptions = winrt::CustomQueryParametersUpdateOptions(args.FeedProviderDefinitionId(), L"param1&param2");
    winrt::FeedManager::GetDefault().SetCustomQueryParameters(updateOptions);
}

İstek üzerine FeedProvider örneği oluşturacak bir sınıf fabrikası kaydetme

FeedProvider sınıfını tanımlayan üst bilgiyi uygulama main.cpp dosyanızın üst kısmındaki eklemelere ekleyin. Mutex'i de buraya dahil edeceğiz.

// main.cpp
...
#include "FeedProvider.h"
#include <mutex>

Uygulamamızın çıkışını tetikleyecek olayı ve olayı ayarlayacak SignalLocalServerShutdown işlevini bildirin. Aşağıdaki kodu main.cpp yapıştırın.

// main.cpp
wil::unique_event g_shudownEvent(wil::EventOptions::None);

void SignalLocalServerShutdown()
{
    g_shudownEvent.SetEvent();
}

Ardından, COM etkinleştirmesi için akış sağlayıcınızı tanımlamak için kullanılacak bir CLSID oluşturmanız gerekir. Araçlar-GUID> Oluştur'a giderek Visual Studio'da BIR GUID oluşturun. "static const GUID =" seçeneğini seçin ve Kopyala'a tıklayın, ardından bunu main.cpp'ye yapıştırın. GUID tanımını aşağıdaki C++/WinRT söz dizimi ile güncelleştirin ve GUID değişken adını feed_provider_clsid ayarlayın. Daha sonra uygulamanızı paketlerken bu biçime ihtiyacınız olacağı için GUID'nin açıklamalı sürümünü bırakın.

// main.cpp
...
// {80F4CB41-5758-4493-9180-4FB8D480E3F5}
static constexpr GUID feed_provider_clsid
{
    0x80f4cb41, 0x5758, 0x4493, { 0x91, 0x80, 0x4f, 0xb8, 0xd4, 0x80, 0xe3, 0xf5 }
};

Aşağıdaki sınıf fabrikası tanımını main.cpp'a ekleyin. Bu çoğunlukla akış sağlayıcısı uygulamalarına özgü olmayan ortak koddur. CoWaitForMultipleObjects uygulamadan çıkmadan önce kapatma olayımızın tetiklanmasını beklediğini unutmayın.

// main.cpp
template <typename T>
struct SingletonClassFactory : winrt::implements<SingletonClassFactory<T>, IClassFactory>
{
    STDMETHODIMP CreateInstance(
        ::IUnknown* outer,
        GUID const& iid,
        void** result) noexcept final
    {
        *result = nullptr;

        std::unique_lock lock(mutex);

        if (outer)
        {
            return CLASS_E_NOAGGREGATION;
        }

        if (!instance)
        {
            instance = winrt::make<FeedProvider>();
        }

        return instance.as(iid, result);
    }

    STDMETHODIMP LockServer(BOOL) noexcept final
    {
        return S_OK;
    }

private:
    T instance{ nullptr };
    std::mutex mutex;
};

int main()
{
    winrt::init_apartment();
    wil::unique_com_class_object_cookie feedProviderFactory;
    auto factory = winrt::make<SingletonClassFactory<winrt::Microsoft::Windows::Widgets::Feeds::Providers::IFeedProvider>>();

    winrt::check_hresult(CoRegisterClassObject(
        feed_provider_clsid,
        factory.get(),
        CLSCTX_LOCAL_SERVER,
        REGCLS_MULTIPLEUSE,
        feedProviderFactory.put()));

    DWORD index{};
    HANDLE events[] = { g_shudownEvent.get() };
    winrt::check_hresult(CoWaitForMultipleObjects(CWMO_DISPATCH_CALLS | CWMO_DISPATCH_WINDOW_MESSAGES,
        INFINITE,
        static_cast<ULONG>(std::size(events)), events, &index));

    return 0;
}

Akış sağlayıcısı uygulamanızı paketleme

Geçerli sürümde yalnızca paketlenmiş uygulamalar akış sağlayıcısı olarak kaydedilebilir. Aşağıdaki adımlar, uygulamanızı paketleme ve uygulamanızı işletim sistemi sağlayıcısı olarak kaydetmek için uygulama bildirimini güncelleştirme işleminde size yol gösterir.

MSIX paketleme projesi oluşturma

Çözüm Gezgini, çözümünüze sağ tıklayın ve Yeni Proje Ekle...>seçin. Yeni Proje Ekle iletişim kutusunda "Windows Uygulama Paketleme Projesi" şablonunu seçin ve İleri'yetıklayın. Proje adını "ExampleFeedProviderPackage" olarak ayarlayın ve Oluştur'a tıklayın. İstendiğinde hedef sürümü 1809 veya sonraki bir sürüme ayarlayın ve Tamam'a tıklayın. Ardından ExampleFeedProviderPackage projesine sağ tıklayın ve Proje Başvurusu Ekle'yi> seçin. ExampleFeedProvider projesini seçin ve Tamam'a tıklayın.

Paketleme projesine Windows Uygulama SDK paket referansı ekleyin

MSIX paketleme projesine Windows Uygulama SDK'sı nuget paketine bir başvuru eklemeniz gerekir. Çözüm Gezgini'nde ExampleFeedProviderPackage projesine çift tıklayarak ExampleFeedProviderPackage.wapproj dosyasını açın. Project öğesinin içine aşağıdaki xml dosyasını ekleyin.

<!--ExampleFeedProviderPackage.wapproj-->
<ItemGroup>
    <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.231116003-experimentalpr">
        <IncludeAssets>build</IncludeAssets>
    </PackageReference>  
</ItemGroup>

Uyarı

PackageReference öğesinde belirtilen Sürüm'in önceki adımda bahsedilen en son kararlı sürümle eşleştiğinden emin olun.

Windows Uygulama SDK'sının doğru sürümü bilgisayarda zaten yüklüyse ve SDK çalışma zamanını paketinizde paketlemek istemiyorsanız, ExampleFeedProviderPackage projesi için Package.appxmanifest dosyasında paket bağımlılığını belirtebilirsiniz.

<!--Package.appxmanifest-->
...
<Dependencies>
...
    <PackageDependency Name="Microsoft.WindowsAppRuntime.1.5.233430000-experimental1" MinVersion="2000.638.7.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
...
</Dependencies>
...

Paket bildirimini güncelleştirme

Çözüm Gezgini'nde dosyaya Package.appxmanifest sağ tıklayın ve Kodu Görüntüle'yi seçerek bildirim xml dosyasını açın. Ardından, kullanacağımız uygulama paketi uzantıları için bazı ad alanı bildirimleri eklemeniz gerekir. Üst düzey Package öğesine aşağıdaki ad alanı tanımlarını ekleyin.

<!-- Package.appmanifest -->
<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"

Application öğesinin içinde Extensions adlı yeni bir boş öğe oluşturun. Bunun uap:VisualElementskapanış etiketinden sonra geldiğinden emin olun.

<!-- Package.appxmanifest -->
<Application>
...
    <Extensions>

    </Extensions>
</Application>

Eklememiz gereken ilk uzantı ComServer uzantısıdır. Bu işlem yürütülebilir dosyanın giriş noktasını işletim sistemine kaydeder. Bu uzantı, bir kayıt defteri anahtarı ayarlayarak COM sunucusu kaydetmenin paketlenmiş uygulama eşdeğeridir ve akış sağlayıcılarına özgü değildir. Aşağıdaki com:Extension öğesini Extensions öğesinin alt öğesi olarak ekleyin. com:Class öğesinin Id özniteliğindeki GUID değerini önceki adımda oluşturduğunuz GUID ile değiştirin.

<!-- Package.appxmanifest -->
<Extensions>
    <com:Extension Category="windows.comServer">
        <com:ComServer>
            <com:ExeServer Executable="ExampleFeedProvider\ExampleFeedProvider.exe" Arguments="-RegisterProcessAsComServer" DisplayName="C++ Feed Provider App">
                <com:Class Id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" DisplayName="FeedProvider" />
            </com:ExeServer>
        </com:ComServer>
    </com:Extension>
</Extensions>

Ardından, uygulamayı akış sağlayıcısı olarak kaydeden uzantıyı ekleyin. uap3:Extension öğesini aşağıdaki kod parçacığına Extensions öğesinin alt öğesi olarak yapıştırın. COM öğesinin ClassId özniteliğini önceki adımlarda kullandığınız GUID ile değiştirdiğinizden emin olun.

<!-- Package.appxmanifest -->
<Extensions>
    ...
    <uap3:Extension Category="windows.appExtension">
        <uap3:AppExtension Name="com.microsoft.windows.widgets.feeds" DisplayName="ContosoFeed" Id="com.examplewidgets.examplefeed" PublicFolder="Public">
            <uap3:Properties>
                <FeedProvider Icon="ms-appx:Assets\StoreLogo.png" Description="FeedDescription">
                    <Activation>
                        <!-- Apps exports COM interface which implements IFeedProvider -->
                        <CreateInstance ClassId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
                    </Activation>
                    <Definitions>
                        <Definition Id="Contoso_Feed"
                            DisplayName="Contoso_Feed Feed"
                            Description="Feed representing Contoso"
                            ContentUri="https://www.contoso.com/"
                            Icon="ms-appx:Images\StoreLogo.png">
                        </Definition>
                        <Definition Id="Fabrikam_Feed"
                            DisplayName="Fabrikam Feed"
                            Description="Feed representing Example"
                            ContentUri="https://www.fabrikam.com/"
                            Icon="ms-appx:Images\StoreLogo.png">
                        </Definition>
                    </Definitions>
                </FeedProvider>
            </uap3:Properties>
        </uap3:AppExtension>
    </uap3:Extension>
</Extensions>

Bu öğelerin tümüne ilişkin ayrıntılı açıklamalar ve biçim bilgileri için bkz . Akış sağlayıcısı paketi bildirim XML biçimi.

Paketleme projenize simge ekleme

Çözüm Gezgini'ndeExampleFeedProviderPackage'ınıza sağ tıklayın ve Yeni> Klasör Ekle'yi seçin. Bu klasöre, önceki adımda Package.appxmanifest'de kullanılan ad olan ProviderAssets adını verin. Burada akışlarımız için Simgemizi depolayacağız. İstediğiniz Simgeleri ekledikten sonra görsel adlarının Path=ProviderAssets\ ardından gelen adlarla eşleştiğinden emin olun, aksi takdirde akışlar Widget Tahtası'nda görünmez.

Akış sağlayıcınızı test etme

Geliştirme makinenizle uyumlu olan mimariyi, örneğin "x64", Çözüm Platformları açılır listesinden seçtiğinizden emin olun. Çözüm Gezgini'nde çözüme sağ tıklayın ve Çözümü Oluşturseçin. Bu işlem tamamlandıktan sonra ExampleWidgetProviderPackage üzerine sağ tıklayın ve Dağıtseçeneğini seçin. Konsol uygulamasının dağıtımda başlatılması gerekir ve konsol çıkışında akışların etkinleştirildiğini görürsünüz. Pencere Öğeleri Panosu'nı açtığınızda yeni akışları akışlar bölümünün üst kısmındaki sekmelerde görmeniz gerekir.

Akış sağlayıcınızda hata ayıklama

Akışlarınızı sabitledikten sonra Pencere Öğesi Platformu, akışla ilgili bilgileri almak ve göndermek için akış sağlayıcısı uygulamanızı başlatır. Çalışan akışta hata ayıklamak için çalışan akış sağlayıcısı uygulamasına bir hata ayıklayıcısı ekleyebilir veya başladıktan sonra Visual Studio'yu akış sağlayıcısı işleminde hata ayıklamayı otomatik olarak başlatacak şekilde ayarlayabilirsiniz.

Çalışan işleme eklemek için:

  1. Visual Studio'da Hata Ayıklama ->işleme ekle'ye tıklayın.
  2. İşlemleri filtreleyin ve istediğiniz akış sağlayıcısı uygulamasını bulun.
  3. Hata ayıklayıcısını ekleyin.

Hata ayıklayıcıyı başlangıçta başlatıldığında işleme otomatik olarak eklemek için:

  1. Visual Studio'da Hata Ayıkla -> Diğer Hata Ayıklama Hedefleri -> Yüklü Uygulama Paketinde Hata Ayıklama'ya tıklayın.
  2. Paketleri filtreleyin ve istediğiniz akış sağlayıcısı paketini bulun.
  3. Bunu seçin ve "Başlatmayın, ancak başlatıldığında kodumu hata ayıklayın" diyen kutuyu işaretleyin.
  4. Ekle'e tıklayın.

Konsol uygulamanızı Windows uygulamasına dönüştürme

Bu kılavuzda oluşturulan konsol uygulamasını bir Windows uygulamasına dönüştürmek için:

  1. çözüm gezgini ExampleWidgetProvider projesine sağ tıklayın ve Özelliklerseçeneğini belirleyin. Bağlayıcısı -> Sistem öğesine gidin ve Alt Sistem "Konsol"u "Windows" olarak değiştirin. Bu, <Alt Sistemi>Windows</SubSystem> ekleyerek .vcxproj dosyasının <Bağlantı>..</Link> bölümüne yapılabilir.
  2. main.cpp'de int main() ile int WINAPI wWinMain(_In_ HINSTANCE /*hInstance*/, _In_opt_ HINSTANCE /*hPrevInstance*/, _In_ PWSTR pCmdLine, _In_ int /*nCmdShow*/)'i değiştirin.

Çıkış türü Windows Uygulaması olarak ayarlanmış C++ akış sağlayıcısı proje özelliklerini gösteren ekran görüntüsü

Akış sağlayıcısı uygulamanızı yayımlama

Akış sağlayıcınızı geliştirip test ettikten sonra, kullanıcıların cihazlarına akışlarınızı yükleyebilmesi için uygulamanızı Microsoft Store'da yayımlayabilirsiniz. Uygulama yayımlamaya yönelik adım adım yönergeler için bkz. Uygulamanızı Microsoft Store'da yayımlama.

Besleme Mağazası Koleksiyonu

Uygulamanız Microsoft Store'da yayımlandıktan sonra, uygulamanızın kullanıcıların Windows akışlarını içeren uygulamaları bulmasına yardımcı olan akışlar Mağaza Koleksiyonu'na eklenmesini isteyebilirsiniz. İsteğinizi göndermek için bkz. Mağaza Koleksiyonu'na eklemek üzere Akışınızı/Panonuzu gönderme.