Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Er zijn verschillende manieren waarop u bestaande C++-code in UWP-projecten (Universal Windows Platform) kunt gebruiken. Op sommige manieren hoeft code niet opnieuw te worden gecompileerd met de onderdeelextensies (C++/CX) ingeschakeld (met andere woorden, met de /ZW optie), en bij andere wel. Mogelijk moet u code in standaard C++bewaren of een klassieke Win32-compilatieomgeving behouden voor bepaalde code. U kunt dit nog steeds doen, met de juiste architectuurkeuzes. Houd rekening met al uw code die uwP-gebruikersinterface en typen bevat die beschikbaar zijn voor C#, Visual Basic en JavaScript-aanroepers. Deze code moet zich in Windows App-projecten en Windows Runtime-onderdeelprojecten bevinden. Code die u alleen aanroept vanuit C++ (inclusief C++/CX) kan zich ofwel in een project bevinden dat compileert met de optie /ZW of in een standaard C++-project. Binaire code die geen niet-toegestane API's gebruikt, kan worden gebruikt door deze als een statische bibliotheek te koppelen. U kunt deze ook inpakken met de app als inhoud en laden in een DLL.
Misschien is de eenvoudigste manier om uw bureaubladprogramma uit te voeren in de UWP-omgeving door gebruik te maken van de Desktop Bridge-technologieën. Ze bevatten het conversieprogramma voor desktop-apps, waarmee uw bestaande toepassing wordt verpakt als een UWP-app zonder dat er codewijzigingen nodig zijn. Zie Desktop Bridge voor meer informatie.
In de rest van dit artikel wordt beschreven hoe u C++-bibliotheken (DLL's en statische bibliotheken) kunt overzetten naar het Universal Windows-platform. Mogelijk wilt u uw code overzetten, zodat uw kernlogica van C++ kan worden gebruikt met meerdere UWP-apps.
UWP-apps worden uitgevoerd in een beveiligde omgeving. Als gevolg hiervan zijn veel Win32-, COM- en CRT-API-aanroepen die mogelijk inbreuk maken op platformbeveiliging niet toegestaan. De /ZW compileroptie kan dergelijke aanroepen detecteren en een fout genereren. U kunt de App Certification Kit in uw toepassing gebruiken om code te detecteren waarmee niet-toegestane API's worden aangeroepen. Zie de Certificeringskit voor Windows-apps voor meer informatie.
Als broncode beschikbaar is voor de bibliotheek, kunt u proberen om de niet-toegestane API-aanroepen te elimineren. Zie Win32- en COM-API's voor UWP-apps enCRT-functies die niet worden ondersteund in Universal Windows Platform-apps voor een lijst met API's die niet zijn toegestaan. Sommige alternatieven vindt u in Alternatieven voor Windows-API's in UWP-apps.
Als u alleen een verwijzing uit een Universeel Windows-project probeert toe te voegen aan een klassieke bureaubladbibliotheek, krijgt u een foutbericht met de mededeling dat de bibliotheek niet compatibel is. Als het een statische bibliotheek is, kunt u een koppeling naar uw bibliotheek maken door de bibliotheek (.lib bestand) toe te voegen aan uw linkerinvoer, op dezelfde manier als in een klassieke Win32-toepassing. Als er alleen een binaire bibliotheek beschikbaar is, is dit de enige optie. Een statische bibliotheek is gekoppeld aan het uitvoerbare bestand van uw app. Een Win32-DLL die u in een UWP-app gebruikt, moet echter in de app worden verpakt door deze in het project op te nemen en als inhoud te markeren. Als u een Win32-DLL wilt laden in een UWP-app, moet u ook bellen LoadPackagedLibrary in plaats van LoadLibrary of LoadLibraryEx.
Als u broncode voor de DLL of statische bibliotheek hebt, kunt u deze opnieuw compileren als een UWP-project met behulp van de /ZW compileroptie. Vervolgens kunt u er een verwijzing naar toevoegen met behulp van Solution Explorer en deze gebruiken in C++ UWP-apps. Koppel het DLL-bestand met behulp van de exportbibliotheek.
Als u functionaliteit beschikbaar wilt maken voor bellers in andere talen, kunt u de bibliotheek converteren naar een Windows Runtime-onderdeel. Windows Runtime-onderdelen verschillen van gewone DLL's omdat ze metagegevens bevatten in de vorm van .winmd bestanden die de inhoud beschrijven op een manier die vereist is voor .NET- en JavaScript-gebruikers. Als u API-elementen beschikbaar wilt maken voor andere talen, kunt u C++/CX-constructies toevoegen, zoals verw-klassen, en deze openbaar maken. In Windows 10 en hoger raden we de C++/WinRT-bibliotheek aan in plaats van C++/CX.
De voorgaande discussie is niet van toepassing op COM-onderdelen, die anders moeten worden afgehandeld. Als u een COM-server in een EXE of DLL hebt, kunt u deze gebruiken in een Universeel Windows-project. Verpakt het als een COM-onderdeel zonder registratie, voeg het toe aan uw project als een inhoudsbestand en instantiëer het met behulp van CoCreateInstanceFromApp. Zie Het gebruik van Free-COM DLL in Windows Store C++ Project voor meer informatie.
Als u een bestaande COM-bibliotheek naar uw UWP wilt overzetten, is het ook mogelijk om deze te converteren naar een Windows Runtime-onderdeel. We raden de C++/WinRT-bibliotheek voor dergelijke poorten aan, maar het is ook mogelijk om de Windows Runtime C++-sjabloonbibliotheek (WRL) te gebruiken. De WRL is afgeschaft en biedt geen ondersteuning voor alle functies van ATL en OLE. Of een dergelijke poort haalbaar is, is afhankelijk van de functies van COM, ATL en OLE waarvoor uw onderdeel is vereist.
Welke ontwikkelscenario's u ook kiest, u moet rekening houden met een aantal macrodefinities. U kunt deze macro's in uw code gebruiken om code voorwaardelijk te compileren onder zowel klassieke desktop Win32 als UWP.
#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)
Deze uitspraken zijn respectievelijk van toepassing op UWP-apps, Windows Phone Store-apps, beide of geen van beiden (alleen klassieke Win32-desktopapps). Deze macro's zijn alleen beschikbaar in Windows SDK 8.1 en hoger.
Dit artikel bevat de volgende procedures:
Een systeemeigen statische C++-bibliotheek gebruiken in een UWP-app
Een C++-bibliotheek overzetten naar een Windows Runtime-onderdeel
Een Win32-DLL gebruiken in een UWP-app
Voor betere beveiliging en betrouwbaarheid worden Universele Windows-apps uitgevoerd in een beperkte runtime-omgeving. U kunt niet alleen een systeemeigen DLL gebruiken zoals u dat zou doen in een klassieke Windows-bureaubladtoepassing. Als u broncode voor een DLL hebt, kunt u de code overzetten zodat deze wordt uitgevoerd op de UWP. U begint met het wijzigen van een paar projectinstellingen en metagegevens van projectbestanden om het project te identificeren als een UWP-project. U gaat de bibliotheekcode opnieuw compileren met behulp van de /ZW optie, waarmee C++/CX wordt ingeschakeld. Bepaalde API-aanroepen zijn niet toegestaan in UWP-apps vanwege strengere controles die aan die omgeving zijn gekoppeld. Zie Win32- en COM-API's voor UWP-apps voor meer informatie.
Als u een systeemeigen DLL hebt die functies exporteert met behulp __declspec(dllexport)van, kunt u deze functies aanroepen vanuit een UWP-app door het DLL-bestand opnieuw te compileren als een UWP-project. Stel dat we een Win32 DLL-project hebben met de naam Giraf dat een aantal klassen en hun methoden exporteert, met code zoals het volgende headerbestand:
// 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();
};
En het volgende codebestand:
// 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();
Alles anders in het project (pch.h, dllmain.cpp) maakt deel uit van de standaard Win32-projectsjabloon. De code definieert de macro GIRAFFE_API, die wordt vertaald naar __declspec(dllexport) wanneer GIRAFFE_EXPORTS is gedefinieerd. Dat wil gezegd, het wordt gedefinieerd wanneer het project wordt gebouwd als een DLL, maar niet wanneer een client de giraffe.h header gebruikt. Dit DLL-bestand kan worden gebruikt in een UWP-project zonder de broncode te wijzigen. Alleen enkele projectinstellingen en eigenschappen moeten worden gewijzigd.
De volgende procedure is van toepassing wanneer u een systeemeigen DLL hebt die functies beschikbaar maakt met behulp van __declspec(dllexport).
Een systeemeigen DLL naar uw UWP overzetten zonder een nieuw project te maken
Open uw DLL-project in Visual Studio.
Open de projecteigenschappen voor het DLL-project en stel de configuratie in op Alle configuraties.
Stel op het tabblad C/C++> de Extensie Windows Runtime gebruiken in op Ja (/ZW) op het tabblad Projecteigenschappen. Met deze eigenschap worden onderdeelextensies (C++/CX) ingeschakeld.
Selecteer in Solution Explorer het projectknooppunt, open het snelmenu en kies Project verwijderen. Open vervolgens het snelmenu op het niet-geladen projectknooppunt en kies ervoor om het projectbestand te bewerken. Zoek het
WindowsTargetPlatformVersionelement en vervang het door de volgende elementen.<AppContainerApplication>true</AppContainerApplication> <ApplicationType>Windows Store</ApplicationType> <WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion> <ApplicationTypeRevision>10.0</ApplicationTypeRevision>Sluit het
.vcxprojbestand, open het snelmenu opnieuw en kies Project opnieuw laden.Solution Explorer identificeert het project nu als een Universeel Windows-project.
Controleer of de naam van het vooraf gecompileerde headerbestand juist is. In de sectie Vooraf gecompileerde kopteksten moet u mogelijk het vooraf gecompileerde headerbestand wijzigen van
pch.hinstdafx.hof andersom als u een fout ziet zoals deze:fout C2857: instructie '#include' opgegeven met de
/Ycpch.hopdrachtregeloptie is niet gevonden in het bronbestandHet probleem is dat oudere projectsjablonen een andere naamconventie gebruiken voor het vooraf gecompileerde headerbestand. Projecten in Visual Studio 2019 en later gebruiken
pch.h.Bouw het project. Mogelijk krijgt u enkele fouten over incompatibele opdrachtregelopties. De nu afgeschafte maar veelgebruikte optie Minimale herbouw inschakelen (/Gm) is bijvoorbeeld standaard ingesteld in veel oudere C++-projecten en is niet compatibel met
/ZW.Sommige functies zijn niet beschikbaar wanneer u compileert voor het Universal Windows-platform. U ziet compilerfouten over eventuele problemen. Los deze fouten op totdat u een schone build hebt.
Als u het DLL-bestand in een UWP-app in dezelfde oplossing wilt gebruiken, opent u het snelmenu voor het UWP-projectknooppunt en kiest uVerwijzing>.
Schakel onder Projects>Solution het selectievakje naast het DLL-project in en kies de knop OK .
Neem de headerbestanden van de bibliotheek op in het
pch.hbestand van uw UWP-app.#include "..\Giraffe\giraffe.h"Voeg zoals gebruikelijk code toe in het UWP-project om functies aan te roepen en typen te maken vanuit het DLL-bestand.
MainPage::MainPage() { InitializeComponent(); GiraffeFactory gf; Giraffe* g = gf.Create(); int id = g->GetID(); }
Een systeemeigen statische C++-bibliotheek gebruiken in een UWP-app
U kunt een systeemeigen statische C++-bibliotheek gebruiken in een UWP-project, maar er zijn enkele beperkingen en beperkingen waar u rekening mee moet houden. Lees eerst over statische bibliotheken in C++/CX. U kunt toegang krijgen tot de systeemeigen code in uw statische bibliotheek vanuit uw UWP-app, maar het wordt afgeraden om openbare reftypen te maken in een dergelijke statische bibliotheek. Als u een statische bibliotheek compileert met de /ZW optie, waarschuwt de bibliothecair (eigenlijk de linker in vermomming) het volgende:
LNK4264: objectbestand archiveren dat is gecompileerd met /ZW in een statische bibliotheek; Houd er rekening mee dat bij het ontwerpen van Windows Runtime-typen het niet wordt aanbevolen om een koppeling te maken met een statische bibliotheek die Metagegevens van Windows Runtime bevat
U kunt echter een statische bibliotheek in een UWP-app gebruiken zonder deze opnieuw te compileren./ZW Uw bibliotheek kan geen reftypen declareren of C++/CX-constructies gebruiken. Maar als u alleen een bibliotheek met systeemeigen code wilt gebruiken, kunt u dit doen door deze stappen te volgen.
Een systeemeigen statische C++-bibliotheek gebruiken in een UWP-project
Kies in de projecteigenschappen voor het UWP-project Configuratie-eigenschappen>Linker>Input in het linkerdeelvenster. Voeg in het rechterdeelvenster het pad naar de bibliotheek toe in de eigenschap Aanvullende afhankelijkheden. Voor een bibliotheek in het project dat zijn uitvoer plaatst in
<SolutionFolder>\Debug\MyNativeLibrary\MyNativeLibrary.lib, voegt u bijvoorbeeld het relatieve padDebug\MyNativeLibrary\MyNativeLibrary.libtoe.Voeg een include-opdracht toe om het headerbestand te
pch.hverwijzen (indien aanwezig) of in een.cppbestand als dat nodig is en begin met code toe te voegen die gebruik maakt van de bibliotheek.#include "..\MyNativeLibrary\MyNativeLibrary.h"Voeg geen verwijzing toe in het knooppunt Verwijzingen in Solution Explorer. Dit mechanisme werkt alleen voor Windows Runtime-onderdelen.
Een C++-bibliotheek overzetten naar een Windows Runtime-onderdeel
Stel dat u systeemeigen API's wilt gebruiken in een statische bibliotheek vanuit een UWP-app. Als u de broncode voor de systeemeigen bibliotheek hebt, kunt u de code overzetten naar een Windows Runtime-onderdeel. Het is geen statische bibliotheek meer; U kunt deze omzetten in een DLL die u kunt gebruiken in elke C++ UWP-app. In deze procedure wordt beschreven hoe u een nieuw Windows Runtime-onderdeel maakt dat gebruikmaakt van C++/CX-extensies. Zie Windows Runtime-onderdelen met C++/WinRT voor informatie over het maken van een onderdeel dat gebruikmaakt van C++/WinRT.
Wanneer u C++/CX gebruikt, kunt u reftypen en andere C++/CX-constructies toevoegen, die beschikbaar zijn voor clients in elke UWP-app-code. U hebt toegang tot deze typen vanuit C#, Visual Basic of JavaScript. De basisprocedure is:
- Een Windows Runtime Component-project (Universal Windows) maken,
- kopieer de code voor uw statische bibliotheek erin en
- los eventuele fouten van de compiler op die worden veroorzaakt door de
/ZWoptie.
Een C++-bibliotheek overzetten naar een Windows Runtime-onderdeel
Maak een Windows Runtime Component-project (Universal Windows).
Sluit het project.
Zoek het nieuwe project in De Verkenner van Windows. Zoek vervolgens het C++-bibliotheekproject met de code die u wilt overzetten. Kopieer de bronbestanden (headerbestanden, codebestanden en andere resources, inclusief in submappen) uit uw C++-bibliotheekproject. Plak ze in de nieuwe projectmap en zorg ervoor dat u dezelfde mapstructuur behoudt.
Open het Windows Runtime Component-project opnieuw. Open het snelmenu voor het projectknooppunt in Solution Explorer en kiesBestaand item>.
Selecteer alle bestanden die u wilt toevoegen vanuit het oorspronkelijke project en kies OK. Herhaal indien nodig voor submappen.
Mogelijk heb je nu wat gedupliceerde code. Als er meer dan één vooraf gecompileerde header is (bijvoorbeeld beide
stdafx.henpch.h), kiest u er een die u wilt behouden. Kopieer elke vereiste code, zoals inclusie-instructies, naar de code die u bewaart. Verwijder vervolgens de andere en zorg ervoor dat de naam van het headerbestand juist is in de projecteigenschappen onder Vooraf gecompileerde headers.Als u het bestand hebt gewijzigd om te gebruiken als de vooraf gecompileerde header, moet u ervoor zorgen dat de opties voor vooraf gecompileerde headers juist zijn voor elk bestand. Selecteer elk
bestand op zijn beurt, open het eigenschappenvenster en zorg ervoor dat alles is ingesteld op Gebruiken (/Yu), met uitzondering van de vooraf gecompileerde header, die moet worden ingesteld opMaken (/Yc). <Bouw het project en los eventuele fouten op. Deze fouten kunnen worden veroorzaakt door de
/ZWoptie te gebruiken of ze kunnen worden veroorzaakt door een nieuwe versie van de Windows SDK. Of ze kunnen afhankelijkheden weergeven, zoals headerbestanden waarop uw bibliotheek afhankelijk is, of verschillen in projectinstellingen tussen uw oude project en het nieuwe.Voeg publieke referentietypen toe aan uw project of converteer gewone typen naar referentietypen. Gebruik deze typen om toegangspunten beschikbaar te maken in de functionaliteit die u wilt aanroepen vanuit UWP-apps.
Test het onderdeel door er een verwijzing aan toe te voegen vanuit een UWP-app-project en voeg code toe om de openbare API's aan te roepen die u hebt gemaakt.