Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Existují různé způsoby použití existujícího kódu C++ v projektech Univerzální platforma Windows (UPW). Některé způsoby nevyžadují překompilování kódu s povolenými rozšířeními komponent (C++/CX) (to znamená s /ZW
možností) a některé z nich. Možná budete muset zachovat kód ve standardním jazyce C++ nebo zachovat klasické prostředí kompilace Win32 pro určitý kód. Můžete to přesto provést s vhodnými možnostmi architektury. Vezměte v úvahu veškerý kód, který obsahuje uživatelské rozhraní UPW a typy, které jsou vystaveny volajícím jazyka C#, Visual Basic a JavaScript. Tento kód by měl být v projektech aplikací pro Windows a v projektech komponent prostředí Windows Runtime. Kód, který voláte pouze z jazyka C++ (včetně C++/CX), může být buď v projektu, který se zkompiluje s možností, nebo standardním projektem /ZW
C++. Binární kód, který nepoužívá nepovolené rozhraní API, je možné ho použít tak, že ho propojíte jako statickou knihovnu. Nebo ji můžete zabalit s aplikací jako obsah a načíst ji do knihovny DLL.
Možná nejjednodušší způsob, jak spustit desktopový program v prostředí UPW, je použít Přemostění na desktop technologie. Zahrnují převaděč desktopových aplikací, který zabalí vaši stávající aplikaci jako aplikaci pro UPW bez nutnosti změn kódu. Další informace najdete v tématu Přemostění na desktop.
Zbytek tohoto článku popisuje, jak portovat knihovny C++ (knihovny DLL a statické knihovny) do Univerzální platforma Windows. Svůj kód můžete chtít přenést, aby se vaše základní logika C++ mohla používat s několika aplikacemi pro UPW.
Aplikace pro UPW běží v chráněném prostředí. V důsledku toho není povoleno mnoho volání rozhraní API Win32, COM a CRT, která by mohla ohrozit zabezpečení platformy. Možnost kompilátoru /ZW
může taková volání rozpoznat a vygenerovat chybu. Sadu App Certification Kit ve vaší aplikaci můžete použít ke zjištění kódu, který volá nepovolené rozhraní API. Další informace naleznete v tématu Windows App Certification Kit.
Pokud je zdrojový kód pro knihovnu k dispozici, můžete se pokusit odstranit nepovolené volání rozhraní API. Seznam rozhraní API, která nejsou povolená, najdete v tématu Rozhraní API Win32 a COM pro aplikace pro UPW a funkce CRT, které nejsou v aplikacích Univerzální platforma Windows podporované. Některé alternativy najdete na webu Alternativy k rozhraním API pro Windows v aplikacích pro UPW.
Pokud se jenom pokusíte přidat odkaz z univerzálního projektu Windows do klasické desktopové knihovny, zobrazí se chybová zpráva s informací, že knihovna není kompatibilní. Pokud se jedná o statickou knihovnu, můžete ji propojit přidáním knihovny (.lib
souboru) do vstupu linkeru stejným způsobem jako v klasické aplikaci Win32. Pokud je dostupná jenom binární knihovna, je to jediná možnost. Statická knihovna je propojená se spustitelným souborem vaší aplikace. Knihovna DLL win32, kterou používáte v aplikaci pro UPW, je však nutné ji zabalit do aplikace zahrnutím do projektu a jeho označením jako obsah. Chcete-li načíst knihovnu DLL Win32 v aplikaci pro UPW, musíte LoadPackagedLibrary
LoadLibrary
místo nebo LoadLibraryEx
.
Pokud máte zdrojový kód pro knihovnu DLL nebo statickou knihovnu, můžete ho znovu zkompilovat jako projekt UPW pomocí možnosti kompilátoru /ZW
. Pak k němu můžete přidat odkaz pomocí Průzkumník řešení a použít ho v aplikacích pro UPW jazyka C++. Propojte knihovnu DLL pomocí knihovny exportu.
Pokud chcete zpřístupnit funkce volajícím v jiných jazycích, můžete knihovnu převést na komponentu prostředí Windows Runtime. prostředí Windows Runtime Komponenty se liší od běžných knihoven DLL v tom, že obsahují metadata ve formě .winmd
souborů, které popisují obsah způsobem, který uživatelé .NET a JavaScript vyžadují. Pokud chcete zpřístupnit elementy rozhraní API pro jiné jazyky, můžete přidat konstrukty C++/CX, jako jsou třídy ref, a zpřístupnit je jako veřejné. Ve Windows 10 a novějších doporučujeme místo C++/CX knihovnu C++/WinRT.
Předchozí diskuze se nevztahuje na komponenty modelu COM, které je potřeba zpracovat jinak. Pokud máte server COM v exe nebo DLL, můžete jej použít v univerzálním projektu Windows. Zabalte ji jako komponentu COM bez registrace, přidejte ji do projektu jako soubor Obsahu a vytvořte instanci pomocí CoCreateInstanceFromApp
. Další informace naleznete v tématu Použití knihovny DLL free-COM v projektu C++ pro Windows Store.
Pokud chcete přenést existující knihovnu MODELU COM do UPW, je také možné ji převést na komponentu prostředí Windows Runtime. Pro tyto porty doporučujeme knihovnu C++/WinRT, ale je také možné použít knihovnu šablon jazyka C++ (WRL) prostředí Windows Runtime C++. Služba WRL je zastaralá a nepodporuje všechny funkce ATL a OLE. Zda je takový port proveditelný, závisí na funkcích modelu COM, ATL a OLE, které vaše komponenta vyžaduje.
Podle toho, které scénáře vývoje zvolíte, byste měli znát řadu definic maker. Tato makra můžete v kódu použít ke kompilaci kódu podmíněně v klasické desktopové verzi Win32 i UPW.
#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)
Tyto příkazy platí pro aplikace pro UPW, aplikace pro Windows Phone Store, obojí nebo ani jedno (jenom klasické desktopové prostředí Win32). Tato makra jsou k dispozici pouze v sadě Windows SDK 8.1 a novější.
Tento článek obsahuje následující postupy:
Použití knihovny DLL Win32 v aplikaci pro UPW
Kvůli lepšímu zabezpečení a spolehlivosti běží univerzální aplikace pro Windows v prostředí s omezeným modulem runtime. Nemůžete jen použít žádnou nativní knihovnu DLL tak, jak byste použili v klasické desktopové aplikaci Windows. Pokud máte zdrojový kód pro knihovnu DLL, můžete kód přenést tak, aby běžel na UPW. Začnete tím, že změníte několik nastavení projektu a metadata souboru projektu, aby se projekt identifikoval jako projekt UPW. Kód knihovny znovu zkompilujete pomocí /ZW
možnosti, která povolí C++/CX. Určitá volání rozhraní API nejsou v aplikacích pro UPW povolená kvůli přísnějším ovládacím prvkům přidruženým k danému prostředí. Další informace najdete v tématech Win32 a rozhraní COM API pro aplikace pro UPW.
Pokud máte nativní knihovnu DLL, která exportuje funkce pomocí __declspec(dllexport)
, můžete tyto funkce volat z aplikace UPW opětovným zkompilováním knihovny DLL jako projektu UPW. Předpokládejme například, že máme projekt Win32 DLL s názvem Giraffe , který exportuje několik tříd a jejich metod, s kódem jako následující hlavičkový soubor:
// 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();
};
A následující soubor kódu:
// 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();
Všechno ostatní v projektu (pch.h
, dllmain.cpp
) je součástí standardní šablony projektu Win32. Kód definuje makro GIRAFFE_API
, které se přeloží na __declspec(dllexport)
kdy GIRAFFE_EXPORTS
je definováno. To znamená, že je definována, když je projekt vytvořen jako knihovna DLL, ale ne když klient používá hlavičku giraffe.h
. Tuto knihovnu DLL lze použít v projektu UPW beze změny zdrojového kódu. Je potřeba změnit jenom některá nastavení a vlastnosti projektu.
Následující postup platí, pokud máte nativní knihovnu DLL, která zveřejňuje funkce pomocí __declspec(dllexport)
.
Port nativní knihovny DLL do UPW bez vytvoření nového projektu
Otevřete projekt knihovny DLL v sadě Visual Studio.
Otevřete vlastnosti projektu knihovny DLL a nastavte konfiguraci na všechny konfigurace.
Ve vlastnostech nastavte > na Ano (/ZW). Tato vlastnost umožňuje rozšíření komponent (C++/CX).
V Průzkumník řešení vyberte uzel projektu, otevřete místní nabídku a zvolte Uvolnit projekt. Pak otevřete místní nabídku v uzlu uvolněného projektu a zvolte, jestli chcete soubor projektu upravit.
WindowsTargetPlatformVersion
Vyhledejte prvek a nahraďte ho následujícími prvky.<AppContainerApplication>true</AppContainerApplication> <ApplicationType>Windows Store</ApplicationType> <WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion> <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
.vcxproj
Zavřete soubor, znovu otevřete místní nabídku a zvolte Znovu načíst projekt.Průzkumník řešení teď projekt identifikuje jako univerzální projekt Windows.
Ujistěte se, že je název předkompilovaného souboru záhlaví správný. V části Předkompilované hlavičky možná budete muset změnit předkompilovaný hlavičkový soubor z
pch.h
stdafx.h
jiného nebo jiného umístění, pokud se zobrazí chyba podobná této:Chyba C2857: Příkaz #include zadaný s možností příkazového
/Ycpch.h
řádku nebyl ve zdrojovém souboru nalezen.Problémem je, že starší šablony projektů používají pro předkompilovaný soubor hlaviček jinou konvenci pojmenování. Visual Studio 2019 a novější projekty používají
pch.h
.Sestavte projekt. Může se zobrazit několik chyb o nekompatibilních možnostech příkazového řádku. Například nyní zastaralá, ale často používaná možnost Povolit minimální opětovné sestavení (/Gm) je ve výchozím nastavení nastavena v mnoha starších projektech C++ a není kompatibilní s
/ZW
.Některé funkce nejsou při kompilaci pro Univerzální platforma Windows dostupné. Zobrazí se chyby kompilátoru týkající se jakýchkoli problémů. Vyřešte tyto chyby, dokud nebudete mít čistý build.
Pokud chcete použít knihovnu DLL v aplikaci pro UPW ve stejném řešení, otevřete místní nabídku pro uzel projektu UPW a zvolte Přidat>odkaz.
V části >zaškrtněte políčko vedle projektu knihovny DLL a zvolte tlačítko OK.
Do souboru aplikace
pch.h
pro UPW zahrňte hlavičkové soubory knihovny.#include "..\Giraffe\giraffe.h"
Přidejte kód jako obvykle v projektu UPW pro vyvolání funkcí a vytvoření typů z knihovny DLL.
MainPage::MainPage() { InitializeComponent(); GiraffeFactory gf; Giraffe* g = gf.Create(); int id = g->GetID(); }
Použití nativní statické knihovny jazyka C++ v aplikaci pro UPW
Nativní statickou knihovnu jazyka C++ můžete použít v projektu UPW, ale existují určitá omezení a omezení, o nichž je potřeba vědět. Začněte čtením o statických knihovnách v C++/CX. Z aplikace pro UPW můžete získat přístup k nativnímu kódu ve statické knihovně, ale nedoporučuje se vytvářet veřejné typy ref v takové statické knihovně. Pokud zkompilujete statickou knihovnu /ZW
s možností, knihovnice (ve skutečnosti linker v maskování) upozorní:
LNK4264: archivace souboru objektu kompilovaného pomocí /ZW do statické knihovny; Upozorňujeme, že při vytváření prostředí Windows Runtime typů se nedoporučuje propojit se statickou knihovnou, která obsahuje metadata prostředí Windows Runtime.
Statickou knihovnu však můžete použít v aplikaci pro UPW, aniž byste ji /ZW
museli znovu zkompilovat . Vaše knihovna nemůže deklarovat žádné typy ref ani používat konstrukty C++/CX. Pokud je ale vaším účelem pouze použít knihovnu nativního kódu, můžete to udělat pomocí následujícího postupu.
Použití nativní statické knihovny jazyka C++ v projektu UPW
Ve vlastnostech projektu UPW zvolte konfigurace. V pravém podokně přidejte cestu ke knihovně ve vlastnosti Další závislosti . Například pro knihovnu v projektu, která umístí jeho výstup do
<SolutionFolder>\Debug\MyNativeLibrary\MyNativeLibrary.lib
, přidejte relativní cestuDebug\MyNativeLibrary\MyNativeLibrary.lib
.Přidejte příkaz include, který bude odkazovat na soubor hlaviček do souboru
pch.h
(pokud je k dispozici) nebo v libovolném.cpp
souboru podle potřeby a začnete přidávat kód, který knihovnu používá.#include "..\MyNativeLibrary\MyNativeLibrary.h"
Do uzlu Reference v Průzkumník řešení nepřidávejte odkaz. Tento mechanismus funguje pouze pro komponenty prostředí Windows Runtime.
Přenos knihovny C++ do komponenty prostředí Windows Runtime
Předpokládejme, že chcete využívat nativní rozhraní API ve statické knihovně z aplikace pro UPW. Pokud máte zdrojový kód pro nativní knihovnu, můžete kód přenést do komponenty prostředí Windows Runtime. Už to nebude statická knihovna. převedete ho na knihovnu DLL, kterou můžete použít v libovolné aplikaci pro UPW jazyka C++. Tento postup popisuje, jak vytvořit novou komponentu prostředí Windows Runtime, která používá rozšíření C++/CX. Informace o vytvoření komponenty, která místo toho používá C++/WinRT, najdete v tématu prostředí Windows Runtime komponent pomocí C++/WinRT.
Při použití jazyka C++/CX můžete přidat typy ref a další konstrukty C++/CX, které jsou k dispozici klientům v libovolném kódu aplikace pro UPW. K těmto typům se dostanete z C#, Visual Basicu nebo JavaScriptu. Základní postup je:
- Vytvoření projektu prostředí Windows Runtime Component (Universal Windows)
- zkopírujte do ní kód pro statickou knihovnu a
- vyřešte případné chyby z kompilátoru způsobené možností
/ZW
.
Port knihovny C++ do komponenty prostředí Windows Runtime
Vytvořte projekt prostředí Windows Runtime Component (Universal Windows).
Zavřete projekt.
V systému Windows Průzkumník souborů vyhledejte nový projekt. Pak vyhledejte projekt knihovny C++, který obsahuje kód, který chcete portovat. Zkopírujte zdrojové soubory (soubory hlaviček, soubory kódu a další prostředky, včetně podadresářů) z projektu knihovny C++. Vložte je do nové složky projektu a nezapomeňte zachovat stejnou strukturu složek.
Znovu otevřete projekt komponenty prostředí Windows Runtime. Otevřete místní nabídku pro uzel projektu v Průzkumník řešení a zvolte Přidat>
Vyberte všechny soubory, které chcete přidat z původního projektu, a zvolte OK. V případě potřeby opakujte pro podsložky.
Teď můžete mít nějaký duplicitní kód. Pokud existuje více než jedno předkompilované záhlaví (řekněme obojí
stdafx.h
ipch.h
), zvolte jednu, která se má zachovat. Zkopírujte libovolný požadovaný kód, například příkazy include, do požadovaného kódu, který uchováváte. Potom odstraňte druhý a ve vlastnostech projektu v části Předkompilované hlavičky se ujistěte, že je název souboru záhlaví správný.Pokud jste změnili soubor tak, aby se používal jako předkompilovaná hlavička, ujistěte se, že jsou pro každý soubor správné možnosti předkompilované hlavičky. Vyberte jednotlivé
.cpp
soubory, otevřete okno vlastností a ujistěte se, že jsou všechny nastavené na Použít (/Yu) s výjimkou předkompilované hlavičky, která by měla být nastavená na Vytvořit (/Yc).Sestavte projekt a vyřešte případné chyby. Tyto chyby můžou být způsobené použitím
/ZW
této možnosti nebo můžou být způsobeny novou verzí sady Windows SDK. Nebo můžou odrážet závislosti, jako jsou soubory hlaviček, na které knihovna závisí, nebo rozdíly v nastavení projektu mezi starým a novým projektem.Přidejte do projektu veřejné typy ref nebo převeďte běžné typy na typy ref. Pomocí těchto typů můžete zpřístupnit vstupní body do funkcí, které chcete volat z aplikací pro UPW.
Otestujte komponentu přidáním odkazu z projektu aplikace UPW a přidejte kód pro volání veřejných rozhraní API, která jste vytvořili.