Aracılığıyla paylaş


Nasıl yapılır: Evrensel Windows Platformu uygulamasında mevcut C++ kodunu kullanma

Evrensel Windows Platformu (UWP) projelerinde mevcut C++ kodunu kullanmanın çeşitli yolları vardır. Bazı yollar, kodun bileşen uzantıları (C++/CX) etkin (yani seçenekle) ile yeniden derlenmesini /ZW gerektirmez ve bazıları bunu yapar. Kodu standart C++ dilinde tutmanız veya bazı kodlar için klasik win32 derleme ortamını korumanız gerekebilir. Uygun mimari seçenekleriyle bunu yapmaya devam edebilirsiniz. UWP kullanıcı arabirimini ve C#, Visual Basic ve JavaScript çağıranlarına sunulan türleri içeren tüm kodunuzu göz önünde bulundurun. Bu kod Windows Uygulama projelerinde ve Windows Çalışma Zamanı Bileşeni projelerinde olmalıdır. Yalnızca C++'tan çağırdığınız kod (C++/CX dahil) seçeneğiyle derlenen bir projede veya standart bir C++ projesinde /ZW olabilir. İzin verilmeyen API'leri kullanmayan yalnızca ikili kod, statik kitaplık olarak bağlanarak kullanılabilir. Alternatif olarak, uygulamayı içerik olarak paketleyebilir ve bir DLL'ye yükleyebilirsiniz.

Masaüstü programınızı UWP ortamında çalıştırmanın belki de en kolay yolu Masaüstü Köprüsü teknolojilerini kullanmaktır. Bunlar, mevcut uygulamanızı kod değişikliği gerektirmeden bir UWP uygulaması olarak paketleyen Desktop App Converter'ı içerir. Daha fazla bilgi için bkz. Masaüstü Köprüsü.

Bu makalenin geri kalanında C++ kitaplıklarının (DLL'ler ve statik kitaplıklar) Evrensel Windows Platformu nasıl taşınabilir olduğu açıklanır. Çekirdek C++ mantığınızın birden çok UWP uygulamasıyla kullanılabilmesi için kodunuzu taşımanız gerekebilir.

UWP Uygulamaları korumalı bir ortamda çalışır. Sonuç olarak, platform güvenliğini tehlikeye atabilecek birçok Win32, COM ve CRT API çağrısına izin verilmez. Derleyici seçeneği bu /ZW tür çağrıları algılayabilir ve bir hata oluşturabilir. İzin verilmeyen API'leri çağıran kodu algılamak için uygulamanızda Uygulama Sertifikasyon Seti'ni kullanabilirsiniz. Daha fazla bilgi için bkz . Windows Uygulama Sertifikasyon Seti.

Kitaplık için kaynak kodu kullanılabiliyorsa, izin verilmeyen API çağrılarını ortadan kaldırmayı deneyebilirsiniz. İzin verilmeyen API'lerin listesi için bkz. UWP uygulamaları için Win32 ve COM API'leri ve Evrensel Windows Platformu uygulamalarında desteklenmeyen CRT işlevleri. Bazı alternatifler UWP uygulamalarında Windows API'lerine alternatifler bölümünde bulunabilir.

Evrensel Windows Projesi'nden klasik masaüstü kitaplığına başvuru eklemeye çalışırsanız, kitaplığın uyumlu olmadığını belirten bir hata iletisi alırsınız. Bu bir statik kitaplıksa, kitaplığını (.lib dosyasını) klasik Win32 uygulamasında yaptığınız gibi bağlayıcı girişinize ekleyerek kitaplığınıza bağlanabilirsiniz. Yalnızca bir ikili kitaplık varsa, tek seçenek bu olur. Statik kitaplık, uygulamanızın yürütülebilir dosyasıyla bağlantılıdır. Ancak, UWP uygulamasında kullandığınız bir Win32 DLL'si projeye dahil edilerek ve İçerik olarak işaretlenerek uygulamaya paketlenmelidir. UWP uygulamasına Win32 DLL yüklemek için veya LoadLibraryExyerine LoadLibrary de aramanız LoadPackagedLibrary gerekir.

DLL veya statik kitaplık için kaynak kodunuz varsa, derleyici seçeneğini kullanarak /ZW bunu UWP projesi olarak yeniden derleyebilirsiniz. Ardından Çözüm Gezgini kullanarak başvuru ekleyebilir ve bunu C++ UWP uygulamalarında kullanabilirsiniz. Dışarı aktarma kitaplığını kullanarak DLL'yi bağlayın.

İşlevselliği diğer dillerdeki arayanlara göstermek için kitaplığı bir Windows Çalışma Zamanı Bileşenine dönüştürebilirsiniz. Windows Çalışma Zamanı Bileşenleri, .NET ve JavaScript tüketicilerinin ihtiyaç duydukları şekilde içeriği açıklayan dosya biçiminde .winmd meta veriler içermeleri bakımından normal DLL'lerden farklıdır. API öğelerini diğer dillerde kullanıma açmak için, başvuru sınıfları gibi C++/CX yapıları ekleyebilir ve bunları genel hale getirebilirsiniz. Windows 10 ve sonraki sürümlerde C++/CX yerine C++/WinRT kitaplığını öneririz.

Önceki tartışma, farklı şekilde işlenmesi gereken COM bileşenleri için geçerli değildir. EXE veya DLL'de COM sunucunuz varsa, bunu Evrensel Windows Projesi'nde kullanabilirsiniz. Bunu kayıtsız COM bileşeni olarak paketleyin, projenize İçerik dosyası olarak ekleyin ve kullanarak CoCreateInstanceFromAppörneği açın. Daha fazla bilgi için bkz . Windows Mağazası C++ Projesi'nde Free-COM DLL kullanma.

Mevcut bir COM kitaplığını UWP'ye geçirmek istiyorsanız, bunu Windows Çalışma Zamanı Bileşenine de dönüştürebilirsiniz. Bu tür bağlantı noktaları için C++/WinRT kitaplığını öneririz, ancak Windows Çalışma Zamanı C++ Şablon Kitaplığı'nı (WRL) kullanmak da mümkündür. WRL kullanım dışıdır ve ATL ve OLE'nin tüm özelliklerini desteklemez. Böyle bir bağlantı noktasının uygun olup olmadığı, bileşeninizin gerektirdiği COM, ATL ve OLE özelliklerine bağlıdır.

Hangi geliştirme senaryolarını seçerseniz seçin, bir dizi makro tanımının farkında olmanız gerekir. Kodunuzda bu makroları kullanarak hem klasik masaüstü Win32 hem de UWP altında koşullu olarak kod derleyebilirsiniz.

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

Bu deyimler sırasıyla UWP uygulamaları, Windows Telefon Mağazası uygulamaları veya her ikisi için de geçerlidir (yalnızca klasik Win32 masaüstü). Bu makrolar yalnızca Windows SDK 8.1 ve sonraki sürümlerde kullanılabilir.

Bu makale aşağıdaki yordamları içerir:

UWP Uygulamasında Win32 DLL Kullanma

Daha iyi güvenlik ve güvenilirlik için Evrensel Windows Uygulamaları kısıtlı çalışma zamanı ortamında çalışır. Herhangi bir yerel DLL'yi klasik bir Windows masaüstü uygulamasında kullandığınız gibi kullanamazsınız. DLL için kaynak kodunuz varsa, kodu UWP üzerinde çalışacak şekilde taşıyabilirsiniz. Projeyi UWP projesi olarak tanımlamak için birkaç proje ayarlarını ve proje dosyası meta verilerini değiştirerek işe başlarsınız. C++/CX'i etkinleştiren seçeneğini kullanarak /ZW kitaplık kodunu yeniden derleyeceksiniz. Bu ortamla ilişkili daha katı denetimler nedeniyle UWP uygulamalarında belirli API çağrılarına izin verilmez. Daha fazla bilgi için bkz . UWP uygulamaları için Win32 ve COM API'leri.

kullanarak __declspec(dllexport)işlevleri dışarı aktaran bir yerel DLL'niz varsa, DLL'yi UWP projesi olarak yeniden derleyerek bu işlevleri bir UWP uygulamasından çağırabilirsiniz. Örneğin, aşağıdaki üst bilgi dosyası gibi kodla birkaç sınıfı ve yöntemlerini dışarı aktaran Giraffe adlı bir Win32 DLL projemiz olduğunu varsayalım:

// giraffe.h
// Define GIRAFFE_EXPORTS when building this DLL
#pragma once

#ifdef GIRAFFE_EXPORTS
#define GIRAFFE_API __declspec(dllexport)
#else
#define GIRAFFE_API
#endif

GIRAFFE_API int giraffeFunction();

class Giraffe
{
    int id;
        Giraffe(int id_in);
    friend class GiraffeFactory;

public:
    GIRAFFE_API int GetID();
};

class GiraffeFactory
{
    static int nextID;

public:
    GIRAFFE_API GiraffeFactory();
    GIRAFFE_API static int GetNextID();
    GIRAFFE_API static Giraffe* Create();
};

Ve aşağıdaki kod dosyası:

// giraffe.cpp
#include "pch.h"
#include "giraffe.h"

Giraffe::Giraffe(int id_in) : id(id_in)
{
}

int Giraffe::GetID()
{
    return id;
}

int GiraffeFactory::nextID = 0;

GiraffeFactory::GiraffeFactory()
{
    nextID = 0;
}

int GiraffeFactory::GetNextID()
{
    return nextID;
}

Giraffe* GiraffeFactory::Create()
{
    return new Giraffe(nextID++);
}

int giraffeFunction();

Projedeki diğer her şey (pch.h, dllmain.cpp) standart Win32 proje şablonunun bir parçasıdır. Kod, tanımlandığı zaman GIRAFFE_EXPORTS olarak çözümlenen __declspec(dllexport) makroyu GIRAFFE_APItanımlar. Başka bir ifadeyle, proje DLL olarak derlendiğinde tanımlanır, ancak istemci üst bilgiyi kullandığında giraffe.h tanımlanmaz. Bu DLL, kaynak kodu değiştirmeden bir UWP projesinde kullanılabilir. Yalnızca bazı proje ayarlarının ve özelliklerinin değiştirilmesi gerekir.

Aşağıdaki yordam, kullanarak __declspec(dllexport)işlevleri kullanıma sunan bir yerel DLL'niz olduğunda geçerlidir.

Yeni proje oluşturmadan yerel DLL'yi UWP'ye taşıma

  1. DLL projenizi Visual Studio'da açın.

  2. DLL projesinin Proje Özellikleri'ni açın ve Yapılandırma'yı Tüm Yapılandırmalar olarak ayarlayın.

  3. Proje Özellikleri'nde, C/C++>Genel sekmesinde, Windows Çalışma Zamanı Uzantısını Tüket'i Evet (/ZW) olarak ayarlayın. Bu özellik bileşen uzantılarını (C++/CX) etkinleştirir.

  4. Çözüm Gezgini proje düğümünü seçin, kısayol menüsünü açın ve Projeyi Kaldır'ı seçin. Ardından, kaldırılan proje düğümünde kısayol menüsünü açın ve proje dosyasını düzenlemeyi seçin. WindowsTargetPlatformVersion öğesini bulun ve aşağıdaki öğelerle değiştirin.

    <AppContainerApplication>true</AppContainerApplication>
    <ApplicationType>Windows Store</ApplicationType>
    <WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion>
    <WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion>
    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
    

    .vcxproj Dosyayı kapatın, kısayol menüsünü yeniden açın ve Projeyi Yeniden Yükle'yi seçin.

    Çözüm Gezgini şimdi projeyi Evrensel Windows projesi olarak tanımlar.

  5. Önceden derlenmiş üst bilgi dosya adınızın doğru olduğundan emin olun. Önceden Derlenmiş Üst Bilgiler bölümünde, aşağıdakine benzer bir hata görürseniz Önceden Derlenmiş Üst Bilgi Dosyası'nı pch.hstdafx.h olarak veya başka bir yolla değiştirmeniz gerekebilir:

    error C2857: Komut satırı seçeneğiyle /Ycpch.h belirtilen '#include' deyimi kaynak dosyada bulunamadı

    Sorun, eski proje şablonlarının önceden derlenmiş üst bilgi dosyası için farklı bir adlandırma kuralı kullanmasıdır. Visual Studio 2019 ve üzeri projelerde kullanılır pch.h.

  6. Projeyi derleyin. Uyumsuz komut satırı seçenekleriyle ilgili bazı hatalar alabilirsiniz. Örneğin, şimdi kullanım dışı bırakılan ancak sık kullanılan En Az Yeniden Derlemeyi Etkinleştir (/Gm) seçeneği birçok eski C++ projesinde varsayılan olarak ayarlanır ve ile /ZWuyumsuzdur.

    Evrensel Windows Platformu için derleme yaptığınızda bazı işlevler kullanılamaz. Tüm sorunlarla ilgili derleyici hataları görürsünüz. Temiz bir derlemeye sahip olana kadar bu hataları giderin.

  7. DLL'yi aynı çözümdeki bir UWP uygulamasında kullanmak için UWP proje düğümünün kısayol menüsünü açın ve Başvuru Ekle'yi>seçin.

    Projeler>Çözümü'nin altında, DLL projesinin yanındaki onay kutusunu seçin ve tamam düğmesini seçin.

  8. Kitaplığın üst bilgi dosyalarını UWP uygulamanızın pch.h dosyasına ekleyin.

    #include "..\Giraffe\giraffe.h"
    
  9. İşlevleri çağırmak ve DLL'den türler oluşturmak için UWP projesinde her zamanki gibi kod ekleyin.

    MainPage::MainPage()
    {
        InitializeComponent();
        GiraffeFactory gf;
        Giraffe* g = gf.Create();
        int id = g->GetID();
    }
    

UWP Uygulamasında yerel C++ statik kitaplığı kullanma

UWP projesinde yerel bir C++ statik kitaplığı kullanabilirsiniz, ancak dikkat etmeniz gereken bazı kısıtlamalar ve sınırlamalar vardır. C++/CX içindeki statik kitaplıkları okuyarak başlayın. Statik kitaplığınızdaki yerel koda UWP uygulamanızdan erişebilirsiniz, ancak böyle bir statik kitaplıkta genel başvuru türleri oluşturmanız önerilmez. Seçeneğiyle /ZW statik bir kitaplık derlerseniz, kitaplıkçı (aslında gizlenen bağlayıcı) uyarır:

LNK4264: /ZW ile derlenen nesne dosyasını statik bir kitaplıkta arşivleme; Windows Çalışma Zamanı tür yazarken, Windows Çalışma Zamanı meta verileri içeren statik bir kitaplıkla bağlantı kurulmaması önerilir

Ancak, ile /ZWyeniden derlemeden bir UWP uygulamasında statik kitaplık kullanabilirsiniz. Kitaplığınız herhangi bir başvuru türü bildiremez veya C++/CX yapılarını kullanamaz. Ancak, amacınız yalnızca yerel kod kitaplığı kullanmaksa, bu adımları izleyerek bunu yapabilirsiniz.

UWP projesinde yerel C++ statik kitaplığı kullanmak için

  1. UWP projesinin proje özelliklerinde, sol bölmede Yapılandırma Özellikleri>Bağlayıcı>Girişi'ni seçin. Sağ bölmede, Ek Bağımlılıklar özelliğindeki kitaplığın yolunu ekleyin. Örneğin, projedeki çıktısını <SolutionFolder>\Debug\MyNativeLibrary\MyNativeLibrary.libiçine yerleştiren bir kitaplık için göreli yolunu Debug\MyNativeLibrary\MyNativeLibrary.libekleyin.

  2. Üst bilgi dosyasına dosyanıza pch.h (varsa) veya gerekirse herhangi bir .cpp dosyaya başvurmak için bir include deyimi ekleyin ve kitaplığı kullanan kodu eklemeye başlayın.

    #include "..\MyNativeLibrary\MyNativeLibrary.h"
    

    Çözüm Gezgini'da Başvurular düğümüne başvuru eklemeyin. Bu mekanizma yalnızca Windows Çalışma Zamanı Bileşenleri için çalışır.

C++ Kitaplığını Windows Çalışma Zamanı Bileşenine Taşıma

Yerel API'leri bir UWP uygulamasından statik bir kitaplıkta kullanmak istediğinizi varsayalım. Yerel kitaplığın kaynak koduna sahipseniz, kodu bir Windows Çalışma Zamanı Bileşenine taşıyabilirsiniz. Artık statik kitaplık olmayacak; bunu herhangi bir C++ UWP uygulamasında kullanabileceğiniz bir DLL'ye dönüştüreceksiniz. Bu yordamda C++/CX uzantılarını kullanan yeni bir Windows Çalışma Zamanı Bileşeni oluşturma işlemi açıklanır. Bunun yerine C++/WinRT kullanan bir bileşen oluşturma hakkında bilgi için bkz. C++/WinRT ile bileşenleri Windows Çalışma Zamanı.

C++/CX kullandığınızda, herhangi bir UWP uygulama kodundaki istemciler tarafından kullanılabilen başvuru türlerini ve diğer C++/CX yapılarını ekleyebilirsiniz. Bu türlere C#, Visual Basic veya JavaScript'ten erişebilirsiniz. Temel yordam:

  • Windows Çalışma Zamanı Bileşeni (Evrensel Windows) projesi oluşturma,
  • statik kitaplığınızın kodunu içine kopyalayın ve
  • seçeneğinden kaynaklanan tüm hataları derleyiciden giderin /ZW .

C++ kitaplığını Windows Çalışma Zamanı Bileşenine taşıma

  1. bir Windows Çalışma Zamanı Bileşeni (Evrensel Windows) projesi oluşturun.

  2. Projeyi kapatın.

  3. Windows Dosya Gezgini yeni projeyi bulun. Ardından, taşımasını istediğiniz kodu içeren C++ kitaplık projesini bulun. C++ kitaplık projenizden kaynak dosyaları (üst bilgi dosyaları, kod dosyaları ve alt dizinler dahil olmak üzere diğer tüm kaynakları) kopyalayın. Bunları yeni proje klasörüne yapıştırın ve aynı klasör yapısını koruduğundan emin olun.

  4. Windows Çalışma Zamanı Bileşeni projesini yeniden açın. proje düğümünün kısayol menüsünü Çözüm Gezgini açın ve Varolan Öğeyi Ekle'yi>seçin.

  5. Özgün projenizden eklenecek tüm dosyaları seçin ve Tamam'ı seçin. Alt klasörler için gerekirse yineleyin.

  6. Artık bazı yinelenen kodunuz olabilir. Birden fazla önceden derlenmiş üst bilgi varsa (örneğin, hem hem de stdafx.hpch.h), saklamak için birini seçin. Include deyimleri gibi gerekli tüm kodları tuttuğunuz koda kopyalayın. Ardından, diğerini silin ve proje özelliklerinde, Önceden Derlenmiş Üst Bilgiler'in altında üst bilgi dosyasının adının doğru olduğundan emin olun.

    Dosyayı önceden derlenmiş üst bilgi olarak kullanacak şekilde değiştirdiyseniz, önceden derlenmiş üst bilgi seçeneklerinin her dosya için doğru olduğundan emin olun. Sırayla her .cpp dosyayı seçin, özellikler penceresini açın ve önceden derlenmiş üst bilgi dışında tümünün Kullan (/Yu) olarak ayarlandığından emin olun. Bu, Oluştur (/Yc) olarak ayarlanmalıdır.

  7. Projeyi derleyin ve hataları çözün. Bu hatalar seçeneği kullanılarak /ZW veya Windows SDK'nın yeni bir sürümünden kaynaklanabilir. Ya da kitaplığınızın bağımlı olduğu üst bilgi dosyaları gibi bağımlılıkları veya eski projenizle yeni proje arasındaki proje ayarlarındaki farkları yansıtabilir.

  8. Projenize genel başvuru türleri ekleyin veya normal türleri başvuru türlerine dönüştürün. Giriş noktalarını UWP uygulamalarından çağırmak istediğiniz işlevlere göstermek için bu türleri kullanın.

  9. UWP uygulama projesinden bileşene başvuru ekleyerek bileşeni test edin ve oluşturduğunuz genel API'leri çağırmak için kod ekleyin.

Ayrıca bkz.

Evrensel Windows Platformu taşıma