İzlenecek Yol: WRL Kullanarak Temel Windows Çalışma Zamanı Bileşeni Oluşturma

Bu belge Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL) nasıl kullanılacağını gösterir, temel bir Windows Çalışma Zamanı bileşen oluşturmak için.Bileşeni, iki sayıyı toplar ve sonucu asal olduğunda bir olay gerçekleştirir.Bu belge ayrıca JavaScript kullanan bir Windows Mağazası uygulamasından nasıl bileşen kullanılacağını gösterir.

Önkoşullar

İki sayıyı toplayan temel bir Windows Çalışma Zamanı bileşeni oluşturmak için.

  1. Visual Studio'da bir Visual C++ WRLClassLibrary projesi oluşturun.Belge WRL Sınıf Kitaplığı Proje Şablonu bu şablonu indirmeyi açıklar.Projeyi Contoso diye adlandırın.

  2. Contoso.cpp ve Contoso.idl içinde, "WinRTClass" tüm örneklerini "Calculator" ile değiştirin.

  3. Contoso.idl içinde Add yöntemini ICalculator arabirimine ekleyin.

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. Contoso.cpp içinde Add yöntemini public bölümünde, Calculator sınıfının bölümüne ekleyin.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        *value = a + b;
        return S_OK;
    }
    
    Önemli notÖnemli

    Bir COM bileşeni oluşturduğunuzdan, __stdcall çağırma anlaşmasını kullanmayı unutmayın.

    Size bir fonksiyonun parametrelerini nasıl kullandığını açıklamak için _Out_ ve diğer kaynak ek açıklama dili (SAL) açıklamalarını kullanmanızı öneririz.SAL ek açıklamalar ayrıca dönüş değerlerini tanımlar.SAL ek açıklamaları olası hataları C ve C++ kaynak kodu keşfetmek için C/C++ Kod Çözümleme Aracı ile çalışır .Arabellek taşmaları aracı tarafından bildirilen genel kodlama hataları, yerleştirilmemiş bellek, null işaretçi başvuru kopmaları ve bellek ve kaynak sızıntılarını içerir.

JavaScript kullanan bir Windows Mağazası uygulamasından bileşen kullanmak için.

  1. Visual Studio'da yeni bir JavaScript Boş Uygulama projesi Contoso çözümüne ekleyin.Projeyi CalculatorJS diye adlandırın.

  2. CalculatorJS projesi içinde, Contoso projesine bir referans ekleyin.

  3. Default.html içinde body bölümünü bu UI öğeler ile değiştirin:

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. Default.js içinde OnClick fonksiyonunu uygulayın.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!NOT]

    JavaScript içinde, standart adlandırma kuralları ile eşleşmek için yöntemin adının ilk harfi küçük harf ile değiştirilir.

Asal bir sayı hesaplandığı zaman harekete geçen bir olay eklemek için

  1. Contoso.idl içinde ICalculator bildiriminden önce, temsilci türünü tanımlayan, PrimeNumberEvent, bir int argüman sağlayan.

    [uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)]
    delegate HRESULT PrimeNumberEvent(int primeNumber);
    

    delegate anahtar sözcüğünü kullandığınız zaman, MIDL derleyicisi temsilcinin imzası ile uyuşan bir Invoke metodunu içeren bir arabirim oluşturur.Bu örnekte, oluşturulan Contoso_h.h dosyası bu prosedürde daha sonra kullanılacak olan IPrimeNumberEvent arabirimini tanımlar.

    MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E")
    IPrimeNumberEvent : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Invoke( 
            int primeNumber) = 0;
    
    };
    
  2. ICalculator arabirimi içinde, PrimeNumberFound olayını tanımlayın.eventadd ve eventremove öznitelikleri ICalculator arabiriminin hem abone olabileceğini hem de bu olaydan aboneliğini çekebileceğini belirtir.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. Contoso.cpp içinde olay abonelerin yönetilmesi ve olay işleyicisini çağırmak için bir privateMicrosoft::WRL::EventSource üye değişkeni ekleyin.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. Contoso.cpp içine add_PrimeNumberFound, remove_PrimeNumberFound, ve yöntemlerini uygulayın/implemente edin.

    HRESULT __stdcall add_PrimeNumberFound(_In_ IPrimeNumberEvent* event, _Out_ EventRegistrationToken* eventCookie)
    {
        return m_events.Add(event, eventCookie);
    }
    
    HRESULT __stdcall remove_PrimeNumberFound(_In_ EventRegistrationToken eventCookie)
    {
        return m_events.Remove(eventCookie);
    }
    

Bir asal sayı hesaplandığı zaman olayı ayağa kaldırmak için

  1. Contoso.cpp içinde IsPrime yöntemini private bölümünde, Calculator sınıfının bölümüne ekleyin.

    // Determines whether the input value is prime. 
    bool IsPrime(int n)
    {
        if (n < 2)
        {
            return false;
        }
        for (int i = 2; i < n; ++i)
        {
            if ((n % i) == 0)
            {
                return false;
            }
        }
        return true;
    }
    
  2. Bir asal sayı hesaplandığı zaman Calculator'nin Add yöntemini düzenleyin, Microsoft::WRL::EventSource::InvokeAll metodunu çağırmak için.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        int c = a + b;
        if (IsPrime(c))
        {
            m_events.InvokeAll(c);
        }
        *value = c;
        return S_OK;
    }
    

JavaScript'den olay işlemek için

  1. Default.html içinde asal sayıları içeren bir metin alanı eklemek için body bölümünü düzenleyin.

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <p id="primes" style="color:#808080">Primes found:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  2. Default.js içinde Add fonksiyonunu düzenleyin PrimeNumberFound olayını işlemek için.Olay işleyicisi, önceki adımda tanımlanan metin alanına asal sayı ekler.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
        calculator.onprimenumberfound = function (ev) {
            document.getElementById("primes").innerHTML += " " + ev.target;
        };
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!NOT]

    JavaScript içinde, olay adları küçük harflerle değiştirilir ve başına "on" eklenir standart adlandırma kurallarına uyacak şekilde olması için.

Aşağıda temel hesap makinesi uygulaması gösterilmiştir.

JavaScript kullanarak temel hesaplama uygulaması

Ayrıca bkz.

Kavramlar

Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL)

WRL Sınıf Kitaplığı Proje Şablonu

C/C++ Kod Çözümleme aracı