Megosztás a következőn keresztül:


Útmutató: Meglévő C++ kód használata univerzális Windows-platformalkalmazásban

A meglévő C++ kódokat többféleképpen is használhatja univerzális Windows-platform (UWP) projektekben. Bizonyos módokon nincs szükség a kód újrafordítására az engedélyezett összetevőbővítményekkel (C++/CX) (azaz a /ZW beállítással), és vannak, akik igen. Előfordulhat, hogy a kódot a standard C++-ban kell tartania, vagy meg kell őriznie egy klasszikus Win32 fordítási környezetet bizonyos kódokhoz. Ezt továbbra is megteheti a megfelelő architektúraválasztással. Fontolja meg az összes olyan kódot, amely UWP felhasználói felületet és C#, Visual Basic és JavaScript-hívók számára elérhető típusokat tartalmaz. Ennek a kódnak Windows-alkalmazásprojektekben és Windows Runtime Component-projektekben kell lennie. A kód, amelyet csak C++-ból (beleértve a C++/CX-et is) hív meg, lehet egy olyan projektben, amely a /ZW opcióval fordít, vagy egy standard C++ projektben. A nem engedélyezett API-kat nem használó bináris kód statikus kódtárként való csatolásával használható. Azt is megteheti, hogy tartalomként csomagolja az alkalmazással, és betölti egy DLL-be.

Az asztali program UWP-környezetben való futtatásának legegyszerűbb módja talán az Asztali híd technológiák használata. Ezek közé tartozik az asztali alkalmazáskonverter, amely a meglévő alkalmazást UWP-alkalmazásként csomagolja be, és nincs szükség kódmódosításra. További információ: Asztali híd.

A cikk további része a C++ kódtárak (DLL-ek és statikus kódtárak) univerzális Windows-platformra történő portját ismerteti. Érdemes lehet portolni a kódot, hogy az alapvető C++ logikája több UWP-alkalmazással is használható legyen.

Az UWP-alkalmazások védett környezetben futnak. Emiatt számos Olyan Win32-, COM- és CRT API-hívás nem engedélyezett, amely veszélyeztetheti a platform biztonságát. A /ZW fordítóprogram képes észlelni az ilyen hívásokat, és hibát generálni. Az alkalmazás Alkalmazástanúsítvány-készletével észlelheti a nem engedélyezett API-kat hívó kódot. További információ: Windows App Certification Kit.

Ha a forráskód elérhető a kódtárhoz, megpróbálhatja kiküszöbölni a nem engedélyezett API-hívásokat. A nem engedélyezett API-k listáját az univerzális Windows Platform-alkalmazásokban nem támogatottUWP-alkalmazásokhoz és CRT-függvényekhez készült Win32 és COM API-kban találja. A Windows API-k alternatívái az UWP-alkalmazásokban találhatók.

Ha csak egy univerzális Windows-projekt hivatkozását próbálja hozzáadni egy klasszikus asztali tárhoz, hibaüzenet jelenik meg, amely szerint a tár nem kompatibilis. Ha statikus kódtárról van szó, a könyvtárat (.lib fájlt) a linker bemenetéhez adva ugyanúgy csatolhatja a tárat, mint egy klasszikus Win32-alkalmazásban. Ha csak bináris kódtár érhető el, ez az egyetlen lehetőség. A program statikus kódtárat csatol az alkalmazás végrehajtható fájljához. Az UWP-alkalmazásokban használt Win32 DLL-t azonban be kell csomagolni az alkalmazásba úgy, hogy bele kell foglalni a projektbe, és meg kell jelölni tartalomként. Ha egy Win32 DLL-t szeretne betölteni egy UWP-alkalmazásba, hívnia kell a LoadPackagedLibrary-t ahelyett, hogy a LoadLibrary-t vagy a LoadLibraryEx-t hívná.

Ha rendelkezik a DLL-hez vagy a statikus kódtárhoz tartozó forráskóddal, újrafordíthatja azt UWP projektként a /ZW fordító opcióval. Ezután hozzáadhat egy hivatkozást a Solution Explorer segítségével, és használhatja azt C++ UWP alkalmazásokban. Csatolja a DLL-t az exportálási kódtár használatával.

Ha más nyelveken szeretné elérhetővé tenni a hívók számára a funkciókat, a kódtárat windowsos futtatókörnyezeti összetevővé alakíthatja. A Windows futtatókörnyezet összetevői abban különböznek a szokásos DLL-ektől, hogy olyan fájlok formájában .winmd tartalmaznak metaadatokat, amelyek a .NET- és JavaScript-felhasználók által megkövetelt módon írják le a tartalmat. Ha más nyelvek számára szeretné elérhetővé tenni az API-elemeket, hozzáadhat C++/CX-szerkezeteket, például ref-osztályokat, és közzéteheti őket. Windows 10-ben és újabb verziókban a C++/WinRT kódtárat javasoljuk c++/CX helyett.

Az előző vitafórum nem vonatkozik a COM-összetevőkre, amelyeket másképpen kell kezelni. Ha COM-kiszolgálóval rendelkezik egy EXE-ben vagy DLL-ben, felhasználhatja azt egy Univerzális Windows-projektben. Csomagolja be regisztráció nélküli COM-összetevőként, vegye fel a projektbe tartalomfájlként, majd példányosítsa a CoCreateInstanceFromApp segítségével. További információ: Free-COM DLL használata a Windows Store C++ Projectben.

Ha egy meglévő COM-kódtárat szeretne az UWP-be portolni, windowsos futtatókörnyezeti összetevővé is konvertálhatja. Az ilyen portokhoz a C++/WinRT kódtárat javasoljuk, de a Windows Runtime C++ sablontár (WRL) is használható. A WRL elavult, és nem támogatja az ATL és az OLE összes funkcióját. Az, hogy egy ilyen port megvalósítható-e, az összetevő által igényelt COM, ATL és OLE funkcióktól függ.

Bármelyik fejlesztési forgatókönyvet is választja, tisztában kell lennie számos makródefinícióval. Ezeket a makrókat használhatja a kódban, hogy feltételesen lefordítsa a kódot a klasszikus asztali Win32 és UWP alatt is.

#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)

Ezek az utasítások az UWP-alkalmazásokra, a Windows Phone Áruházbeli alkalmazásokra, mindkettőre vagy egyikre sem vonatkoznak (csak a klasszikus Win32 asztali verzióra). Ezek a makrók csak a Windows SDK 8.1-ben és újabb verzióiban érhetők el.

Ez a cikk a következő eljárásokat tartalmazza:

Win32 DLL használata UWP-alkalmazásban

A nagyobb biztonság és megbízhatóság érdekében az univerzális Windows-alkalmazások korlátozott futtatókörnyezetben futnak. Nem használhat natív DLL-t úgy, ahogyan egy klasszikus Asztali Windows-alkalmazásban tenné. Ha rendelkezik EGY DLL forráskóddal, a kódot úgy portozhatja, hogy az az UWP-n fusson. Először módosítsa a projekt néhány beállítását és a projektfájl metaadatait a projekt UWP-projektként való azonosításához. A kódtár kódját újrafordítja a /ZW opció használatával, amely lehetővé teszi a C++/CX alkalmazását. Bizonyos API-hívások nem engedélyezettek az UWP-alkalmazásokban a környezethez társított szigorúbb vezérlők miatt. További információ: Win32 és COM API-k UWP-alkalmazásokhoz.

Ha van egy natív DLL-je, amely függvényeket exportál a __declspec(dllexport) használatával, meghívhatja ezeket a függvényeket egy UWP-alkalmazásból úgy, hogy a DLL-t UWP-projektként újrafordítja. Tegyük fel például, hogy van egy Zsiráf nevű Win32 DLL-projektünk, amely exportál néhány osztályt és metódust, a következő fejlécfájlhoz hasonló kóddal:

// 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();
};

És a következő kódfájl:

// 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();

A projekt minden más eleme (pch.h, dllmain.cpp) a standard Win32-projektsablon része. A kód meghatározza a makrót GIRAFFE_API, amely __declspec(dllexport) értékre oldódik fel, ha GIRAFFE_EXPORTS definiálva van. Ez azt jelent, hogy a projekt DLL-ként való létrehozásakor van definiálva, de nem akkor, ha egy ügyfél használja a giraffe.h fejlécet. Ez a DLL a forráskód módosítása nélkül használható UWP-projektekben. Csak néhány projektbeállítást és tulajdonságot kell módosítani.

Az alábbi eljárás akkor alkalmazható, ha olyan natív DLL-fájllal rendelkezik, amely függvényeket tesz elérhetővé a használatával __declspec(dllexport).

Natív DLL portálása az UWP-be új projekt létrehozása nélkül

  1. Nyissa meg a DLL-projektet a Visual Studióban.

  2. Nyissa meg a DLL-projekt projektjének projekttulajdonságait , és állítsa a konfigurációtminden konfigurációra.

  3. A Projekt tulajdonságai területen, a C/C++>Általános lap alatt állítsa a Windows futtatókörnyezeti bővítmény használata lehetőséget igen (/ZW) értékre. Ez a tulajdonság engedélyezi az összetevők bővítményeit (C++/CX).

  4. A Megoldáskezelőben válassza ki a projektcsomópontot, nyissa meg a helyi menüt, és válassza a Projekt eltávolítása lehetőséget. Ezután nyissa meg a helyi menüt a kiürített projektcsomóponton, és válassza a projektfájl szerkesztését. Keresse meg az WindowsTargetPlatformVersion elemet, és cserélje le a következő elemekre.

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

    Zárja be a .vcxproj fájlt, nyissa meg újra a helyi menüt, és válassza a Project újratöltése lehetőséget.

    A Megoldáskezelő mostantól univerzális Windows-projektként azonosítja a projektet.

  5. Győződjön meg arról, hogy az előre összeállított fejlécfájl neve helyes. Az Előre összeállított fejlécek szakaszban előfordulhat, hogy módosítania kell az előre összeállított fejlécfájltpch.hstdafx.h a másikról a másikra, ha az alábbihoz hasonló hibaüzenet jelenik meg:

    C2857 hiba: A parancssori beállítással /Ycpch.h megadott "#include" utasítás nem található a forrásfájlban

    A probléma az, hogy a régebbi projektsablonok eltérő elnevezési konvencióval használják az előre összeállított fejlécfájlt. A Visual Studio 2019 és az azutáni projektek a pch.h-et használják.

  6. Készítse el a projektet. Előfordulhat, hogy a nem kompatibilis parancssori beállításokkal kapcsolatban hibaüzenet jelenik meg. Például a jelenleg elavult, de gyakran használt Enable Minimal Rebuild (/Gm) beállítás alapértelmezés szerint be van állítva számos régebbi C++ projektben, és nem kompatibilis a következővel /ZW: .

    Egyes függvények nem érhetők el az univerzális Windows-platformra való fordításkor. A kompilátor hibáit fogja látni bármilyen problémával kapcsolatban. Addig kell elhárítania ezeket a hibákat, amíg nem ér el egy tiszta buildet.

  7. Ha ugyanabban a megoldásban szeretné használni a DLL-t egy UWP-alkalmazásban, nyissa meg az UWP-projektcsomópont helyi menüjét, és válassza aHivatkozás>.

    A Projektek>megoldása csoportban jelölje be a DLL-projekt melletti jelölőnégyzetet, majd kattintson az OK gombra.

  8. Inkludálja a könyvtár fejlécfájlja(i)t az UWP alkalmazás pch.h kódjába.

    #include "..\Giraffe\giraffe.h"
    
  9. Az UWP-projektben a szokásos módon adjon hozzá kódot a függvények meghívásához és a DLL-ből való típusok létrehozásához.

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

Natív C++ statikus kódtár használata UWP-alkalmazásban

Natív C++ statikus kódtárat használhat egy UWP-projektben, de vannak bizonyos korlátozások és korlátozások, amelyeket figyelembe kell venni. Kezdje a C++/CX statikus kódtárak olvasásával. A statikus kódtár natív kódját az UWP-alkalmazásból érheti el, de nem ajánlott nyilvános ref-típusokat létrehozni egy ilyen statikus tárban. Ha egy statikus könyvtárat állít össze a /ZW beállítással, a könyvtáros (valójában a linker álruhában) figyelmeztet:

LNK4264: a /ZW használatával lefordított objektumfájl archiválása statikus tárba; vegye figyelembe, hogy Windows-futtatókörnyezet-típusok létrehozásakor nem ajánlott a Windows futtatókörnyezet metaadatait tartalmazó statikus kódtárral összekapcsolni

Az UWP-alkalmazásokban azonban használhat statikus kódtárat anélkül, hogy újrafordítást végezhet a következővel /ZW: . A kódtár nem deklarálhat ref-típusokat, és nem használhat C++/CX szerkezeteket. Ha azonban a cél csak egy natív kódtár használata, akkor ezt az alábbi lépések végrehajtásával teheti meg.

Natív C++ statikus kódtár használata UWP-projektben

  1. Az UWP-projekt projekttulajdonságaiban válassza a konfigurációs tulajdonságok>összekapcsoló>bemenete lehetőséget a bal oldali panelen. A jobb oldali panelen adja hozzá az elérési utat a tárhoz a További függőségek tulajdonságban. Ha például a projekt egyik kódtára a kimenetét <SolutionFolder>\Debug\MyNativeLibrary\MyNativeLibrary.libhelyezi el, adja hozzá a relatív elérési utat Debug\MyNativeLibrary\MyNativeLibrary.lib.

  2. Adjon hozzá egy beillesztési utasítást, amely hivatkozik a fejlécfájlra a pch.h fájlba (ha van), vagy bármely .cpp fájlban, ahogy szükséges, és kezdje el hozzáadni a könyvtárat használó kódot.

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

    Ne adjon hozzá hivatkozást a MegoldáskezelőHivatkozások csomópontjában. Ez a mechanizmus csak Windows futtatókörnyezeti összetevők esetén működik.

C++ kódtár portolása Windows futtatókörnyezeti összetevőbe

Tegyük fel, hogy natív API-kat szeretne használni egy statikus kódtárban egy UWP-alkalmazásból. Ha rendelkezik a natív kódtár forráskóddal, a kódot egy Windows futtatókörnyezeti összetevőbe is portozhatja. Többé nem lesz statikus kódtár; A dll-t bármely C++ UWP-alkalmazásban használhatja. Ez az eljárás azt ismerteti, hogyan hozhat létre új Windows futtatókörnyezeti összetevőt, amely C++/CX kiterjesztéseket használ. A C++/WinRT-et használó összetevők létrehozásáról további információt a C++/WinRT rendszerű Windows Futtatókörnyezet-összetevők című témakörben talál.

C++/CX használata esetén hozzáadhat ref-típusokat és más C++/CX-szerkezeteket, amelyek bármely UWP-alkalmazáskódban elérhetők az ügyfelek számára. Ezeket a típusokat a C#, a Visual Basic vagy a JavaScript használatával érheti el. Az alapművelet a következő:

  • Windows-futtatókörnyezet-összetevő (Univerzális Windows) projekt létrehozása,
  • másolja be a statikus kódtár kódját, és
  • a fordító által az /ZW opció okozta hibák elhárítása.

Egy C++ könyvtár portolása Windows futtatókörnyezeti összetevővé

  1. Hozzon létre egy Windows futtatókörnyezeti összetevőt (univerzális Windows) projekt.

  2. Zárja be a projektet.

  3. A Windows Fájlkezelőben keresse meg az új projektet. Ezután keresse meg a portolni kívánt kódot tartalmazó C++ kódtárprojektet. Másolja ki a forrásfájlokat (fejlécfájlokat, kódfájlokat és minden más erőforrást, beleértve az alkönyvtárakat is) a C++ kódtárprojektből. Illessze be őket az új projektmappába, hogy megőrizze ugyanazt a mappastruktúrát.

  4. Nyissa meg újra a Windows Futtatókörnyezet összetevő projektjét. Nyissa meg a projektcsomópont helyi menüjét a Megoldáskezelőben, és válassza aMeglévő elem>.

  5. Jelölje ki az eredeti projektből hozzáadni kívánt összes fájlt, majd kattintson az OK gombra. Szükség esetén ismételje meg az almappákra vonatkozóan.

  6. Lehet, hogy már van néhány duplikált kódja. Ha egynél több előre összeállított fejléc van (például mindkettő stdafx.h és pch.h), válasszon egyet, amelyet meg szeretne tartani. Másolja a szükséges kódot, például az include utasításokat, a megtartani kívánt kódba. Ezután törölje a másikat, és a projekttulajdonságokban, az Előre lefordított fejlécek csoportban győződjön meg arról, hogy a fejlécfájl neve helyes.

    Ha úgy módosította a fájlt, hogy az előre összeállított fejlécként legyen használva, győződjön meg arról, hogy az előre összeállított fejléc beállításai helyesek az egyes fájlokhoz. Válassza ki az egyes .cpp fájlokat, nyissa meg a tulajdonságok ablakát, és győződjön meg arról, hogy mindegyiket az Use (/Yu) beállításra állította, kivéve az előre összeállított fejlécet, amit a Létrehozás (/Yc) beállításra kell állítania.

  7. Hozza létre a projektet, és oldja meg a hibákat. Ezeket a hibákat a beállítás használata vagy a /ZW Windows SDK új verziója okozhatja. Vagy olyan függőségeket is tükrözhetnek, mint a kódtártól függő fejlécfájlok, vagy a projektbeállítások különbségei a régi és az új projekt között.

  8. Adjon hozzá nyilvános ref típusokat a projekthez, vagy alakítsa át a szokásos típusokat ref típusokká. Ezekkel a típusokkal elérhetővé teheti a belépési pontokat az UWP-alkalmazásokból meghívni kívánt funkciókban.

  9. Tesztelje az összetevőt egy UWP-alkalmazásprojektből származó hivatkozás hozzáadásával, és adjon hozzá néhány kódot a létrehozott nyilvános API-k meghívásához.

Lásd még

Portolás az univerzális Windows-platformra