Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Saat Anda menggunakan Visual Studio untuk membangun kode mode pengguna untuk Windows 10, Anda dapat menyesuaikan opsi linker untuk menargetkan versi Windows tertentu. Pertimbangkan faktor berikut:
Haruskah biner bawaan hanya berjalan pada versi Windows terbaru? Atau harus berjalan pada versi yang lebih lama, seperti Windows 7?
Apakah proyek Anda memiliki dependensi UWP ?
Misalnya, saat Anda membuat proyek driver UMDF v2 baru, Visual Studio menautkan secara OneCoreUAP.lib default. Ini menghasilkan biner yang berjalan pada versi Terbaru Windows, dan memungkinkan penambahan fungsionalitas UWP.
Namun, tergantung pada kebutuhan Anda, Anda dapat memilih untuk menautkan ke OneCore.lib. Tabel berikut ini memperlihatkan skenario yang berlaku untuk setiap pustaka:
| Pustaka | Skenario |
|---|---|
OneCore.lib |
Semua edisi Windows 7 dan yang lebih baru, tidak ada dukungan UWP |
OneCoreUAP.lib |
Windows 7 dan yang lebih baru, edisi UWP (Desktop, IoT, HoloLens, tetapi bukan Nano Server) dari Windows 10 |
Catatan
Untuk mengubah opsi linker di Visual Studio, pilih properti proyek dan navigasikan ke Dependensi Linker-Input-Tambahan>>.
Subset API Windows dikompilasi dengan bersih tetapi mengembalikan kesalahan runtime pada edisi OneCore non-Desktop (misalnya Mobile atau IoT).
Misalnya, fungsi InstallApplication kembali ERROR_ NOT_SUPPORTED pada edisi OneCore non-Desktop. Alat ApiValidator juga melaporkan masalah ini. Bagian berikutnya menjelaskan cara memperbaikinya.
Memperbaiki kesalahan ApiValidator dengan menggunakan IsApiSetImplemented
Jika kode Anda memanggil API non-universal, Anda mungkin melihat kesalahan ApiValidator berikut:
Error: <Binary Name> has unsupported API call to <Module Name><Api Name>Jika aplikasi atau driver dasar Anda perlu berjalan pada Windows 10 serta versi Windows yang lebih lama, Anda harus menghapus panggilan API dalam kategori di atas.
Error: <Binary Name> has a dependency on <Module Name><Api Name> but is missing: IsApiSetImplemented("<contract-name-for-Module>)Panggilan API dalam kategori di atas mengkompilasi halus, tetapi mungkin tidak berperilaku seperti yang diharapkan pada runtime, tergantung pada sistem operasi target. Untuk melewati persyaratan Lapisan API untuk Driver Windows, bungkus panggilan ini dengan IsApiSetImplemented.
Ini memungkinkan Anda untuk mengkompilasi kode Anda tanpa kesalahan. Kemudian pada runtime, jika komputer target tidak memiliki API yang diperlukan, IsApiSetImplemented mengembalikan FALSE.
Sampel kode berikut mengilustrasikan cara melakukan ini.
Sampel kode: Penggunaan API langsung, tanpa mengevaluasi keberadaan
Kode ini berjalan dengan baik pada versi Windows yang lebih lama dari Windows 10, tetapi menjalankannya pada edisi OneCore Windows 10 menghasilkan kegagalan WTSEnumerateSessions : 78 atau ERROR_CALL_NOT_IMPLEMENTED 120 (0x78).
Sampel kode ini gagal pada persyaratan Lapisan API Driver Windows dengan kesalahan ApiValidator berikut:
ApiValidation: Error: FlexLinkTest.exe has a dependency on 'wtsapi32.dll!WTSEnumerateSessionsW' but is missing: IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0")
ApiValidation: Error: FlexLinkTest.exe has a dependency on 'wtsapi32.dll!WTSFreeMemory' but is missing: IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0")
ApiValidation: NOT all binaries are Universal
Berikut kodenya:
#include <windows.h>
#include <stdio.h>
#include <Wtsapi32.h>
int __cdecl wmain(int /* argc */, PCWSTR /* argv */ [])
{
PWTS_SESSION_INFO pInfo = {};
DWORD count = 0;
if (WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pInfo, &count))
{
wprintf(L"SessionCount = %d\n", count);
for (ULONG i = 0; i < count; i++)
{
PWTS_SESSION_INFO pCurInfo = &pInfo[i];
wprintf(L" %s: ID = %d, state = %d\n", pCurInfo->pWinStationName, pCurInfo->SessionId, pCurInfo->State);
}
WTSFreeMemory(pInfo);
}
else
{
wprintf(L"WTSEnumerateSessions failure : %x\n", GetLastError());
}
return 0;
}
Sampel kode: Penggunaan API langsung, setelah mengevaluasi keberadaan
Sampel ini menunjukkan cara memanggil IsApiSetImplemented. Sampel ini melewati persyaratan Lapisan API Driver Windows dengan output ApiValidator berikut:
ApiValidation: All binaries are Universal
Berikut kodenya:
#include <windows.h>
#include <stdio.h>
#include <Wtsapi32.h>
int __cdecl wmain(int /* argc */, PCWSTR /* argv */ [])
{
PWTS_SESSION_INFO pInfo = {};
DWORD count = 0;
if (!IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0"))
{
wprintf(L"IsApiSetImplemented on ext-ms-win-session-wtsapi32-l1-1-0 returns FALSE\n");
}
else
{
if (WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pInfo, &count))
{
wprintf(L"SessionCount = %d\n", count);
for (ULONG i = 0; i < count; i++)
{
PWTS_SESSION_INFO pCurInfo = &pInfo[i];
wprintf(L" %s: ID = %d, state = %d\n", pCurInfo->pWinStationName, pCurInfo->SessionId, pCurInfo->State);
}
WTSFreeMemory(pInfo);
}
else
{
wprintf(L"WTSEnumerateSessions failure : %x\n", GetLastError());
}
}
return 0;
}
Tindakan yang disarankan
- Tinjau opsi linker di atas dan perbarui proyek Visual Studio Anda dengan sesuai.
- Gunakan alat ApiValidator di WDK. Alat ini berjalan secara otomatis saat Anda membuat driver di Visual Studio.
- Gunakan pengujian runtime untuk memverifikasi bahwa kode mode pengguna Anda berjalan seperti yang Anda harapkan pada edisi OneCore non-Desktop. Perhatikan bahwa API yang tersandung dapat menghasilkan kode kesalahan yang berbeda.