青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://www.ithov.com/article/118831.shtml

對于 Windows 8,我們徹底顛覆改造了平臺,您可以選擇您已了解的編程語言和技術來構建為設備和外形因素定制的應用。而對于 Windows 運行時,您甚至可以在單一應用中輕松地使用多種語言。通過使用 C++ 來構建您自有的 Windows 運行時組件,您可以通過可與 Xbox 360 控制器交互的 HTML 和 JavaScript 來構建出色的 Metro 風格應用。您可以構建通過 Windows 運行時組件公開的可重用 XAML 控件,這些控件可供使用 C++ 和 C# 編寫的 Metro 風格應用即時使用。實質上,我們已允許您在 Windows 8 平臺上使用您選擇的語言并以毫不遷就的方式來構建應用。

在本篇博文中,我們將討論構建 Windows 運行時組件所需了解的必要知識。

基礎知識

Windows 運行時是實現語言選擇的核心。它自身是公開的,從而您可以從 JavaScript、C++、C# 和 Visual Basic 中以自然而熟悉的方式對其進行調用。這種基礎方法也同樣適用于構建您自有的 API。

您在應用中構建和打包的 Windows 運行時組件通常被稱作第三方 Windows 運行時組件。這與已作為 Windows 8 平臺中一部分的第一方組件有所不同。您可以使用 C++、C# 或 Visual Basic 編寫這些第三方 Windows 運行時組件。您可以從任何位置調入它們公開的 API,包括打包到您的應用中的其他 Windows 運行時組件。您也可以使用任何語言來調入通過 Windows 運行時組件公開的 API。

您為應用編寫的 Windows 運行時組件可使用 Windows 運行時 API、Win32、COM、.NET API 或第三方庫(只要它們支持 Metro 風格應用開發)。請注意您所構建的 Windows 運行時組件與傳統意義上公開 API 的 C++ DLL 或 .NET 程序集并不相同。使用 .Net 創建類庫或者使用 C++ 創建獨立的 DLL 與構建 Windows 運行時組件完全不同。Windows 運行時組件在公開 Windows 運行時元數據的 .wnmd 文件中聲明,并且允許 JavaScript 等語言來自然地使用 Windows 運行時 API(例如,向 JavaScript 公開的 API 的 pascalCasedNames 支持)。Windows 運行時元數據還允許 Visual Studio 提供出色的工具功能,如 IntelliSense 支持。

為何要構建您自有的 Windows 運行時組件

創建 Windows 運行時組件可幫助您對可重用性和語言互操作性進行設計。我們來看一下展示如何使用第三方 Windows 運行時組件來構建更佳體驗的一些應用程序方案。


在您的 Metro 風格應用中使用 Win32 和 COM API

Internet Explorer 10 提供的平臺允許您使用 HTML、CSS 和 JavaScript 創建出色的 Metro 風格應用體驗。但是,如果您已使用 HTML5 Canvas 構建游戲,并希望與 Windows 的 Xbox 360 控制器相集成,那情況會怎樣?允許應用從控制器接收輸入的 XInput API 會將不可用的 Win32 API 直接向 JavaScript 公開。

這是通過創建 Windows 運行時組件來解決該問題并使您能夠在基于 HTML 的 Metro 風格應用中使用 XInput API 的經典示例。XInput 和 JavaScript 控制器草圖示例準確地展現了這一點。該示例應用包含一個游戲控制器 Windows 運行時組件,它使用 C++ 編寫并用于包裝 XInput API 公開的功能。該控制器草圖基于 HTML 的應用使用游戲控制器 C++ Windows 運行時組件來實現與 Xbox 360 控制器的交互。

這一方案(無法單獨使用 HTML 和 JavaScript 實現)是通過創建第三方 Windows 運行時組件來完成通過其他方法無法完成的復雜方案的完美示例。

大計算量的操作

為諸如科學、工程和地圖/地理等字段創建應用通常需要大計算量的操作。這些大量的操作通常需要強大的并行處理且非常適合于使用 C++ 獲得最佳性能。在開發 Bing 地圖旅行優化器(使用 JavaScript 和 C++ 開發的 Metro 風格應用)中,我們看到了另一種方案,即使用 C++ 創建 Windows 運行時組件使我們可以創建最佳的應用體驗。

您可能會考慮為何用戶完全使用本地數據計算旅行路線,而他們可以在云端的 Bing 服務器上運行這種大計算量的操作。Bing 地圖為公開執行此操作的 JavaScript API,而有時應用必須脫機運行。另外,我們也希望用戶通過觸控實時拖動和更改路線。如果我們在本地運行此類大量的操作,則我們需要創建甚至更好的體驗。

通過使用并行任務類庫而用 C++ 編寫大計算量的操作,我們可以利用客戶端的強大功能來為用戶創建出色的使用體驗。Windows 運行時可完美適用于該方案,它允許我們使用 Bing 地圖 AJAX 控件來創建使用 HTML 和 JavaScript 的豐富用戶界面 (UI),而使用 C++ 代碼運行的所有大量路線操作可通過并行計算提高計算的速度。


社區中擁有著大量而出色的庫,開發人員已進行匯總并與廣大用戶共享。在過去,您可能會認為重用其中的一些庫可能很具挑戰性,如果它們與實現您的應用的編程語言不匹配的話。例如,您構建了一個出色的 .NET 應用,但必須完成痛苦的互操作藍框(如 PInvoke),才能使用通過 C++ 編寫的庫。

Windows 運行時可以彌合 Windows 8 中的語言分歧,使包含單個基本代碼的單一 Windows 運行時組件庫可以擴展至更廣泛的開發人員,無論組件的語言或應用的主要編程語言是什么。

現在,您可以創建一個可供全部 C++ 和 C# 開發人員使用的公開 Windows 運行時的單一 XAML 自定義控件。您可以在您的基于 XAML 或 HTML 的 Metro 風格應用中使用由開發人員共享的各種數據存儲 Windows 運行時庫。所有這些方案均無需編寫互操作代碼即可實現。

我們認為 Windows 運行時將惠及由開發人員創建并與社區中廣泛的 Metro 風格應用??發人員共享的各種庫。現在,我們來看看兩個展示使用 C++/CX 和 C# 構建第三該 Windows 運行時組件的具體示例。

應用場景 1:通過本機音頻來增強您的應用

假設我們要使用擁有 C# 編寫的應用邏輯支持的 XAML 來構建一個軟件合成器應用。為了向我們的音樂應用添加過濾器,我們將使用 XAudio 來直接控制音頻緩沖器。

將 Windows 運行時組件添加到我們的解決方案

使用 Visual Studio,我們可以將全新的 C++ Windows 運行時組件項目添加到我們現有的解決方案。該 Windows 運行時組件包括音樂處理功能:

使用 Visual Studio 來將一個全新的 C++ Windows 運行時組件添加到我們的音樂應用
圖 2:添加一個全新的 C++ Windows 運行時組件

Visual Studio 為我們創建了一個 C++ 項目,用于公開 API,而 API 的實現將打包到一個 DLL 文件,而 Windows 運行時元數據將打包到 winmd 文件中。它們全部可用于我們的 C# 項目。

定義向我們的 XAML C# 項目公開的類

我們使用 C++/CX 來構建向 C# 項目公開的 API,但您也可以使用 Windows 運行時 C++ 模板庫 (WRL)。我們首先定義一個非常基本的類以封裝 XAudio 功能:

XAudioWrapper.h

#pragma once

#include "mmreg.h"
#include <vector>
#include <memory>

namespace XAudioWrapper
{
    public ref class XAudio2SoundPlayer sealed
    {
    public:
        XAudio2SoundPlayer(uint32 sampleRate);
        virtual ~XAudio2SoundPlayer();

        void Initialize();

        bool   PlaySound(size_t index);
        bool   StopSound(size_t index);
        bool   IsSoundPlaying(size_t index);
        size_t GetSoundCount();

        void Suspend();
        void Resume();

    private:
        interface IXAudio2*                     m_audioEngine;
        interface IXAudio2MasteringVoice*       m_masteringVoice;
        std::vector<std::shared_ptr<ImplData>>  m_soundList;
    };
}

首先,您必須注意類聲明中 public、ref 和 sealed 等關鍵字的使用。對于通過 JavaScript 或 C# 等其他語言在 Metro 風格應用中實例化的類來說,該類必須聲明為 public ref class sealed。

類的公共功能(方法、屬性等)僅限于 C++ 內置的類型或 Windows 運行時類型。這些是可在 Windows 運行時組件中跨越語言界限的唯一類型。但話雖如此,您仍然可以將常規的 C++ 庫(即標準模板庫集合)用于您的類中的專用數據成員,如在該代碼斷中所示。這些專用數據成員無需遵從與跨越語言界限有關的規則。如果您使用不支持的構造,則 Visual Studio 編譯器將發出錯誤消息并提供相應的指導。

 

實現在我們的 Windows 運行時組件中公開的類

現在,我們已定義了類的基本接口,接下來讓我們來看看一些實現方法:

XAudioWrapper.cpp

XAudio2SoundPlayer::XAudio2SoundPlayer(uint32 sampleRate) :
m_soundList()
{
// Create the XAudio2 engine
UINT32 flags = 0;

XAudio2Create(&m_audioEngine, flags);

// Create the mastering voice
m_audioEngine->CreateMasteringVoice(
&m_masteringVoice,
XAUDIO2_DEFAULT_CHANNELS,
sampleRate
);
}

void XAudio2SoundPlayer::Resume()
{
m_audioEngine->StartEngine();
}

bool XAudio2SoundPlayer::PlaySound(size_t index)
{
//
// Setup buffer
//
XAUDIO2_BUFFER playBuffer = { 0 };
std::shared_ptr<ImplData> soundData = m_soundList[index];
playBuffer.AudioBytes = soundData->playData->Length;
playBuffer.pAudioData = soundData->playData->Data;
playBuffer.Flags = XAUDIO2_END_OF_STREAM;

HRESULT hr = soundData->sourceVoice->Stop();
if (SUCCEEDED(hr))
{
hr = soundData->sourceVoice->FlushSourceBuffers();
}

//
// Submit the sound buffer and (re)start (ignore any 'stop' failures)
//
hr = soundData->sourceVoice->SubmitSourceBuffer(&playBuffer);
if (SUCCEEDED(hr))
{
hr = soundData->sourceVoice->Start(0, XAUDIO2_COMMIT_NOW);
}

return SUCCEEDED(hr);
}

在該代碼段中,我們使用可用于 Metro 風格應用開發的 XAudio2 COM API 來連接我們的音頻引擎、播放聲音和恢復引擎。另外,我們還可以使用 C++ 構造和除 Windows 運行時類型以外的其他類型來實現必要的功能。

添加和使用 Windows 運行時組件

在定義和實現基本類之后,我們使用 Visual Studio 來將 XAudioWrapper Windows 運行時組件從我們的 C# 項目添加到 C++ 項目:

使用 Visual Studio 來將 XAudioWrapper Windows 運行時組件的引用添加到我們的音樂應用

圖 3:將 XAudioWrapper Windows 運行時組件添加到我們的音樂應用

因此,我們從 C++ 項目公開的類可用于我們的 C# 項目:

MainPage.cs

using XAudioWrapper;

namespace BasicSoundApp
{
public sealed partial class MainPage : Page
{
XAudio2SoundPlayer _audioPlayer = new XAudio2SoundPlayer(48000);
public MainPage()
{
this.InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
_audioPlayer.Initialize();
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
_audioPlayer.PlaySound(0);
}
}
}

如在該代碼段中所示,我們可以像使用常規 .NET 組件那樣與 C# 中的 XAudio 封裝程序進行交互。我們將引用其命名空間、舉例說明組件并開始調用其公開的各種方法。所有這一切不需要任何 DllImport 來調入本機代碼!

應用場景 2:使用內置的 API 在您的應用中打開 zip 文件

假設我們使用 HTML 來構建文件查看器應用,并希望添加功能來允許該應用的用戶選取 zip 文件。我們希望將 Windows 中已內置并在 .NET 平臺中公開的 API 用于處理 zip 文件。

將 Windows 運行時組件添加到我們的解決方案

該步驟與我們在音樂應用中所描述的步驟完全相同,現在我們將選取 C# Windows 運行時組件來包裝 zip 處理功能:

使用 Visual Studio 來將一個全新的 C# Windows 運行時組件添加到我們的文件查看器應用
圖 4:添加一個全新的 C# Windows 運行時組件 

Visual Studio 為我們創建了一個 C# 項目,用于公開 API,而 API 的實現和 Windows 運行時元數據都將打包到 .winmd 文件,并且可用于我們的 Web 項目。


實現在我們的 Windows 運行時組件中公開的類

我們使用 C# 來構建將向我們的 Web 項目公開的 API,但您同樣可以使用 Visual Basic。我們首先定義一個簡單的 C# 類來封裝 zip 功能:

ZipWrapper.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Storage;

public sealed class ZipWrapper
{
public static IAsyncOperationWithProgress<IList<string>, double> EnumerateZipFileAsync(StorageFile file)
{
return AsyncInfo.Run(async delegate(
System.Threading.CancellationToken cancellationToken, IProgress<double> progress)
{
IList<string> fileList = new List<string>();
progress.Report(0);

using (var stream = await file.OpenStreamForReadAsync())
{
using (var archive = new ZipArchive(stream))
{
for (int i = 0; i < archive.Entries.Count; i++)
{
// add code for processing/analysis on the file
// content here

// add to our list and report progress
fileList.Add(archive.Entries[i].FullName);
double progressUpdate = ((i + 1) / ((double)archive.Entries.Count)) * 100; // percentage
progress.Report(progressUpdate);
}
}
}

progress.Report(100.0);
return fileList;
});
}
}

該類是公共的且已密封。類似于構建 C++ Windows 運行時組件,這對于其他語言實例化類來說是必需的。該類中公開的靜態方法混合使用 Windows 運行時類型(例如,StorageFile),并且在方法簽名中作為 .NET 類型(例如,IList)。我們的經驗法則是使用 Windows 運行時類型來定義向其他語言公開的公共字段、參數和返回類型。盡管如此,您仍然可以原封不動地使用某些 .NET 基本類型(即 DateTimeOffset 和 Uri)以及基元(即 IList)。

您還會注意到上述方法利用了在定義您的 Windows 運行時組件時可以(且應該)使用的用于異步性和進度支持的 Windows 運行時基礎結構。就該類中的 Windows 運行時組件或任何專用功能的實現而言,您并不僅限于使用 Windows 運行時類型和 API;您可以自由使用任何向 Metro 應用開發公開的 .NET API 表面,如代碼段 ZipArchive API 中所示。

添加和使用 Windows 運行時組件

我們現在已經實現了 zip 工具封裝程序,我們將使用 Visual Studio 來添加我們的 JavaScript 項目中對 C# 項目的引用:

使用 Visual Studio 添加我們的文件查看器應用中 ZipUtil Windows 運行時組件的引用
圖 5:將 ZipUtil Windows 運行時組件添加到我們的文件查看器應用
 

因此,我們從 C# 項目公開的類將可用于我們的 Web 項目:

program.js

function pickSinglePhoto() {

// Create the picker object for picking zip files
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
openPicker.fileTypeFilter.replaceAll([".zip"]);

// Open the picker for the user to pick a file
openPicker.pickSingleFileAsync().then(function (file) {
if (file) {
ZipUtil.ZipWrapper.enumerateZipFileAsync(file).then(
function (fileList) {
for (var i = 0; i < fileList.length; i++)
document.getElementById('output').innerHTML += " " + fileList[i];
},
function (prog) {
document.getElementById('zipProgress').value = prog;
}
);
} else {
document.getElementById('output').innerHTML = "an error occurred";
}
});
};

正如您所看到的,我們可以與 JavaScript 中我們的 zip 工具封裝程序進行交互,如同它是一個常規的 JavaScript 對象。我們可以調入 Windows 運行時組件中公開的靜態方法,而我們使用 JavaScript 的異步語言構造,如 .then(),也可以完成此操作。

一般指導

并非您為 Metro 風格應用編寫的所有 API 都應公開為第三方 Windows 運行時組件。通常情況下,當您在不同的編程語言之間進行通信時需要使用 Windows 運行時組件類型,并使用語言中內置的類型和構造來實現無法通過 Windows 運行時組件全局公開的功能。另外,跨越語言界限還涉及各種語言特定的功能和規則,當構建 Windows 運行時組件時,您必須將其納入考慮范圍。它們具體包括代理和事件、異步操作、方法重載和處理特定的數據類型(例如,集合、異常處理和調試技巧)。您可以通過訪問構建 Windows 運行時組件中面向您的開發語言的部分,來深入研究這些主題。

總結

就 Windows 運行時組件而言,您現在可以混合使用編寫語言和 API 技術來構建您設想的應用。毫不遷就的理念貫穿于 Windows 8。即使是在開發階段情況依然如此,我們允許您混合使用和匹配適用于您的方案的最佳編程語言。我希望這將使您能夠用更多的時間來考慮創新,而不是在學習全新的編程語言方面浪費大量的時間。

希望您能充分享受構建應用為您帶來的快樂!

-- Windows 項目經理 Ines Khelifi


posted on 2012-10-29 21:16 jackdong 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: Windows RT
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲深夜福利| 亚洲一区在线免费观看| 欧美在线视频免费播放| 乱中年女人伦av一区二区| 欧美一区二区三区四区高清| 亚洲一二三区在线| 欧美/亚洲一区| 亚洲欧美日韩一区二区| 欧美日本免费| 亚洲国产成人不卡| 久久精品女人天堂| 亚洲一级在线观看| 久久高清福利视频| 欧美在线网址| 国产精品亚洲综合一区在线观看| 国产美女精品一区二区三区| 国产亚洲精品aa| 尤妮丝一区二区裸体视频| 久久er99精品| 午夜欧美大片免费观看| 国产欧美日韩亚洲| 欧美在线91| 亚洲性感美女99在线| 亚洲黄页一区| 亚洲国产美女精品久久久久∴| 久久精品夜色噜噜亚洲a∨| 欧美成人精品不卡视频在线观看| 欧美黄色免费| 日韩一级免费| 亚洲毛片在线观看.| 欧美日韩在线播放一区| 一区二区三区视频在线播放| 久久精品国产免费看久久精品| 亚洲一区二区高清| 国产亚洲欧美激情| 99精品国产在热久久| 亚洲欧美成人综合| 亚洲欧美另类在线观看| 国产日韩亚洲| 欧美刺激性大交免费视频| 能在线观看的日韩av| 国产伪娘ts一区| 免费视频一区| 欧美日韩免费高清一区色橹橹| 99视频日韩| 欧美成人亚洲成人| 亚洲综合另类| 欧美高清视频一区二区| 一区二区三区欧美亚洲| 欧美不卡激情三级在线观看| 亚洲特级片在线| 久久精品一本久久99精品| 欧美国产日韩一区二区| 久久综合狠狠| 亚洲午夜精品| 欧美一级久久久久久久大片| 亚洲福利视频一区二区| 亚洲日本中文字幕免费在线不卡| 久久www成人_看片免费不卡| 国产伊人精品| 亚洲日本中文字幕免费在线不卡| 午夜一级在线看亚洲| 永久免费精品影视网站| 一区二区欧美精品| 国内精品美女av在线播放| 91久久精品www人人做人人爽| 欧美三级视频| 欧美+日本+国产+在线a∨观看| 午夜日韩av| 亚洲乱码一区二区| 欧美韩日视频| 国产精品亚洲不卡a| 欧美成人日韩| 国产视频在线观看一区二区| 亚洲激情成人在线| 国产亚洲欧美一级| 久久久国产91| 国产精品久久久亚洲一区| 欧美国产日韩xxxxx| 国产欧美日韩视频一区二区三区| 亚洲人成在线免费观看| 欧美日韩成人激情| 一本久久综合亚洲鲁鲁五月天| 香蕉久久夜色精品国产| 中日韩美女免费视频网址在线观看| 日韩一二在线观看| 欧美日韩亚洲免费| 欧美大香线蕉线伊人久久国产精品| 国产精品亚洲综合久久| 一本色道久久综合精品竹菊 | 欧美三级韩国三级日本三斤| 欧美成人国产一区二区| 国产一区二区欧美| 亚洲在线视频一区| 韩国av一区二区三区在线观看| 久久精品系列| 欧美77777| 免费观看在线综合| 好吊一区二区三区| 亚洲国产精品美女| 欧美日韩亚洲综合| 亚洲人成在线播放| 国产在线精品二区| 午夜精品久久久久久久| 久久精品99久久香蕉国产色戒| 免费不卡在线观看| 欧美激情1区2区| 国产精品女人毛片| 欧美成人午夜激情视频| 国产精品国产三级国产专播精品人| 亚洲人成久久| 亚洲欧美成人网| 国产丝袜美腿一区二区三区| 亚洲免费视频成人| 一区二区动漫| 国产精品国内视频| 亚洲免费人成在线视频观看| 亚洲精品欧美一区二区三区| 亚洲视频欧美视频| 午夜性色一区二区三区免费视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲素人一区二区| 亚洲午夜小视频| 国产精品国产三级国产a| 亚洲国产天堂久久国产91| 亚洲精品少妇网址| 在线亚洲精品| 亚洲欧美日韩国产精品 | 亚洲精品少妇| 激情自拍一区| 久久久91精品| 亚洲福利视频在线| 国产免费成人在线视频| 午夜精品一区二区在线观看 | aa成人免费视频| 国产亚洲欧洲一区高清在线观看| 午夜伦欧美伦电影理论片| 久久精品日韩欧美| 性xx色xx综合久久久xx| 在线日韩av片| 久久久精品动漫| 欧美国产精品人人做人人爱| 久久久久国产一区二区三区四区| 久久久国产一区二区三区| 欧美日韩免费视频| 欧美在线电影| 欧美国产一区视频在线观看| 久久精品国产96久久久香蕉| 欧美高清不卡在线| 这里是久久伊人| 91久久精品国产91久久| 亚洲男人第一网站| 一区二区日韩伦理片| 欧美亚洲在线视频| 欧美在线播放视频| 亚洲高清在线播放| 欧美亚洲不卡| 久久综合中文| 老司机午夜精品| 一区二区欧美日韩| 亚洲国产乱码最新视频| 久久精品一区四区| 欧美在线观看一区二区三区| 在线日韩一区二区| 国产精品大片wwwwww| 久久影音先锋| 欧美激情精品久久久| 亚洲欧美区自拍先锋| 亚洲激情第一区| 国产伦精品一区二区| 一区二区激情视频| 99国产精品99久久久久久| 国产精品男人爽免费视频1| 136国产福利精品导航网址| 精品69视频一区二区三区 | 久久精品九九| 久久成人精品无人区| 日韩亚洲视频| 在线观看一区| 免费亚洲电影在线| 欧美成人精品一区| 亚洲级视频在线观看免费1级| 免费人成网站在线观看欧美高清| 一区二区三区高清视频在线观看| 欧美 日韩 国产精品免费观看| 亚洲女性喷水在线观看一区| 国产欧美日韩精品丝袜高跟鞋| 欧美69视频| 欧美日韩国产免费观看| 乱码第一页成人| 久久久精彩视频| 香蕉久久夜色| 欧美激情二区三区| 免费视频一区| 国产精品99久久久久久有的能看| 欧美日韩国产一区二区三区| 一区二区三区四区精品| 欧美一区二区三区精品 | 男男成人高潮片免费网站| 久久女同互慰一区二区三区|