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

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠(yuǎn),我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數(shù)據(jù)加載中……

關(guān)于exe形式編程的一點(diǎn)心得,希望對大家有所幫助(轉(zhuǎn)載自nokia forum)

其實(shí)我也只是一個(gè)Symbian的初學(xué)者,我能深刻的感受到一個(gè)初學(xué)者在探索新的開發(fā)平臺(tái)時(shí)的坎坷。以下的心得是我經(jīng)過一段很長時(shí)間的探索才得到的,這其 中走了很多彎路,也得到了很多人的幫助。現(xiàn)在我將其整理了一下貼出來,希望能給尋求相關(guān)知識的朋友一些幫助,以便于大家少走一些彎路。
當(dāng)然我的水平有限,理解不深,錯(cuò)誤在所難免,希望大家發(fā)現(xiàn)后能及時(shí)指正。

1.為什么要用exe形式的程序?
相信絕大部分人做Symbian程序都是從app開始的,app的例子非常多,很容易上手。但是有些需求在用app實(shí)現(xiàn)中出現(xiàn)了一些問題,假設(shè)我們要做一 個(gè)來電檢測程序,把所有來電號碼都記錄在一個(gè)文件中。如果用app做當(dāng)然可以實(shí)現(xiàn),但是問題是這個(gè)app是有窗口界面的,但這個(gè)窗口對使用者來說毫無價(jià) 值,白白浪費(fèi)了一大塊資源,但是又不能把這個(gè)窗口關(guān)掉,一旦關(guān)掉,app就終止運(yùn)行了,來電檢測也就無法實(shí)現(xiàn)了。類似的程序的最佳解決方案就是做成exe 形式。
通常exe程序是用來做后臺(tái)服務(wù)的,對使用者來說他是不可見的,通常沒有界面,這樣既節(jié)省了資源,有不會(huì)因?yàn)槭褂谜卟恍⌒年P(guān)閉了程序而導(dǎo)致功能無法實(shí)現(xiàn)。

2.exe程序的框架
exe的例子也有一些,大家可以參考那些例子來建立mmp文件以及程序基礎(chǔ)框架,這里就不多說了。
exe總是從E32Main函數(shù)開始執(zhí)行的,我是用如下的E32Main代碼的:
GLDEF_C TInt E32Main()
{
  CTrapCleanup* cleanup = CTrapCleanup::New();

  RUNMAIN(); // 宏

  _LIT(KMsgPanicEpoc32ex,"EPOC32EX");
  __ASSERT_ALWAYS(!error,User::Panic(KMsgPanicEpoc32ex,error));
  delete cleanup;
  return 0;
}
這里的處理程序 RUNMAIN 其實(shí)是我定義的一個(gè)宏,通常情況下,他是:
#define RUNMAIN() TRAPD(error, MainL());
實(shí)際上就是去掉用MainL。為什么這么做,后面會(huì)提到。
MainL的代碼如下,構(gòu)建了CActiveScheduler,然后就是具體的處理了

void MainL()
{
  CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
  CleanupStack::PushL(scheduler);
  CActiveScheduler::Install(scheduler);

  // 具體的處理
  // ......

  CleanupStack::PopAndDestroy(scheduler);
}

3.如何調(diào)試exe
又了上面的代碼,這個(gè)exe已經(jīng)可以編譯和運(yùn)行了,雖然他什么實(shí)質(zhì)的事情都沒做,但是他的的確確已經(jīng)是一個(gè)合格的exe了。如果你把編譯好的程序放到手機(jī) 上運(yùn)行(用文件管理器打開),你會(huì)發(fā)現(xiàn)什么都沒有發(fā)生,你無法判斷它是否執(zhí)行了,執(zhí)行到哪里了。這就帶來一個(gè)調(diào)試的問題。
首先說說如何在VC6環(huán)境中調(diào)試,這個(gè)比較簡單,調(diào)試app的時(shí)候,我們是指定vc6運(yùn)行那個(gè)模擬器程序的,而調(diào)試exe你只要指定vc6調(diào)試時(shí)運(yùn)行你生 成的那個(gè)exe就可以了,當(dāng)然這個(gè)exe是wins編碼的,不能是手機(jī)上運(yùn)行的armi編碼。調(diào)試運(yùn)行后也會(huì)顯示手機(jī)模擬器的界面,不過沒有9宮格主菜單 了。
比較麻煩的是手機(jī)上的執(zhí)行調(diào)試,如前面提到的那樣,我們可能什么都看不到,那么如何讓exe顯示一些信息呢?這里就需要用到控制臺(tái)Console。Console就如Windows上的dos窗口,是純文本的,對付信息顯示是綽綽有余。
Console的用法也非常簡單,先構(gòu)造CConsoleBase,然后就可以用它的Printf函數(shù)在控制臺(tái)上輸出數(shù)據(jù)了。
我把Console單獨(dú)放在一組cpp/h文件中,如下:

// ================= Start of console.h =======================
#ifndef __CONSOLE_H__
#define __CONSOLE_H__

#include <e32base.h>
#include <e32cons.h>
#include <e32std.h>

#define _DEBUG_CONSOLE_

#ifdef _DEBUG_CONSOLE_
extern CConsoleBase* gConsole;
extern void ConsoleMainL();
#define RUNMAIN() TRAPD(error, ConsoleMainL());
// 顯示字符串
#define CONSOLEPRINTINFO(infostr) gConsole->Printf(infostr);gConsole->Printf(_L("\n"));
// 先是數(shù)字
#define CONSOLEPRINTNUM(num) gConsole->Printf(_L("%d\n"), num);
#else // _DEBUG_CONSOLE_
#define RUNMAIN() TRAPD(error, MainL());
#define CONSOLEPRINTINFO(infostr)
#define CONSOLEPRINTNUM(num)
#endif // _DEBUG_CONSOLE_

#endif //__CONSOLE_H__

// ================= End of console.h =========================

// ================= Start of console.cpp =======================
#include "console.h"
#ifdef _DEBUG_CONSOLE_
extern void MainL();
CConsoleBase* gConsole;
void ConsoleMainL()
{
  gConsole = Console::NewL(_L("MyExe"), TSize(KConsFullScreen, KConsFullScreen));
  MainL();
  delete gConsole;
}
#endif
// ================= End of console.cpp =========================

這樣一來我只要將"#define _DEBUG_CONSOLE_"這一行去掉就可以編譯生成不含Console的最終代碼了,而加上這一行就可以顯示調(diào)試信息。在主代碼中只要調(diào)用 CONSOLEPRINTINFO 和 CONSOLEPRINTNUM 兩個(gè)宏來分別顯示字符串和數(shù)字,而不用再考慮是否define了_DEBUG_CONSOLE_。
看到這里的 RUNMAIN 宏了嗎,他的作用就是在調(diào)試的時(shí)候去執(zhí)行ConsoleMainL,而不是MainL,兩者的區(qū)別就是ConsoleMainL先建立了一個(gè)Console,最后再將其釋放。
放到手機(jī)上運(yùn)行一下吧,運(yùn)行后會(huì)出現(xiàn)一個(gè)全屏的白色窗口,其實(shí)你可能看不清這個(gè)窗口,因?yàn)樗且婚W而過的。怎么會(huì)這樣,呵呵,因?yàn)槲覀兊腗ainL()函數(shù)里面什么都沒做,exe程序當(dāng)然就立即結(jié)束了。你可以嘗試在MainL()函數(shù)“具體的處理”這部分加上兩句話:
CONSOLEPRINTINFO(_L("Hello World!"));
CActiveScheduler::Start();
第一句是在控制臺(tái)上顯示Hello World;第二句開始檢測CActive事件,這里用這個(gè)只是為了能讓程序保持住,而不會(huì)立即結(jié)束。在手機(jī)上運(yùn)行后,你會(huì)發(fā)現(xiàn)一個(gè)白色窗口,上面顯示 Hello World。新的問題又來了,這個(gè)程序現(xiàn)在總也結(jié)束不了了,這時(shí)候需要一個(gè)線程管理工具來終止這個(gè)exe,這樣的工具有AppMan和TaskSpy。
注意你的線程名稱,當(dāng)你是用了Console時(shí),線程名稱就是控制臺(tái)名稱“MyExe”,當(dāng)不用Console時(shí),線程名稱就是那個(gè)exe的名字,這點(diǎn)對下一段很有用。為了保持一致,建議大家將控制臺(tái)名稱設(shè)定為exe程序的名稱。
另外你可以根據(jù)你的需要定義你的顯示宏,而不一定是我這里的 CONSOLEPRINTINFO 和 CONSOLEPRINTNUM。

4.如何防止exe運(yùn)行多個(gè)實(shí)例
和app不同的是,exe可以運(yùn)行多個(gè)實(shí)例,在某些情況下,這是有用的。但是如果我們不需要這個(gè)特性,那么如何才能阻止exe運(yùn)行多個(gè)實(shí)例以減少資源占用呢?這就需要用TFindProcess。
將MainL寫成:

_LIT(KPROCESSNAME, "MyExe*"); // 線程名稱
void MainL()
{
  CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
  CleanupStack::PushL(scheduler);
  CActiveScheduler::Install(scheduler);

  // 尋找符合條件的線程
  TInt pcount = 0;
  TFullName processName;
  TFindProcess findProcess(KPROCESSNAME);
  while (ETrue)
  {
    findProcess.Next(processName);
    if (processName != KNullDesC)
    {
      pcount ++;
      CONSOLEPRINTINFO(processName);
    } else
      break;
  }

  if (pcount <= 1) // 只有本線程運(yùn)行
  {
    // 具體的處理
    // ......
  }

  CONSOLEPRINTINFO(_L("Exe End"));
  CleanupStack::PopAndDestroy(scheduler);
}

注意,KPROCESSNAME是線程主名稱,后面*是一個(gè)通佩符,因?yàn)榫唧w的線程名稱后面還跟著一串?dāng)?shù)字,我們只要定位前面的關(guān)鍵字就可以了。
這里判斷線程的數(shù)量用了 if (pcount <= 1),而不是<1,因?yàn)楫?dāng)前在做判斷的線程也算一個(gè)。
當(dāng)發(fā)現(xiàn)有其他相同的線程在運(yùn)行時(shí),本線程就跳過具體的處理,直接結(jié)束了。這樣就達(dá)到了我們的目的。


5. 如何讓exe程序顯示信息窗口
exe是后臺(tái)的程序,通常是沒有窗口界面的,但是我們有時(shí)候需要讓使用者獲得一些信息。比如一個(gè)鬧鐘提醒程序,平時(shí)在后臺(tái)運(yùn)行,到時(shí)間后除了要播放鬧鈴,可能還需要在屏幕上顯示一些用戶預(yù)先設(shè)置的提示信息,如"XXX生日"之類的。這時(shí)候就需要來構(gòu)造一個(gè)窗口。

// ================= Start of Window.h =======================
//

#if !defined(__MY_WINDOW_H__)
#define __MY_WINDOW_H__

class CWindow;

/////////////////////////////////////////////////////////////////////////
////////////////////// Declaration of CWsClient /////////////////////////
/////////////////////////////////////////////////////////////////////////

// Base class for all windows
class CWsClient : public CActive
{
protected:
  //construct
  CWsClient(const TRect& aRect);

public:
  static CWsClient* NewL(const TRect& aRect);
  void ConstructL();
  // destruct
  ~CWsClient();

public:
  // terminate cleanly
  void Exit();
  // active object protocol
  void IssueRequest(); // request an event
  void DoCancel(); // cancel the request

  virtual void RunL(); // handle completed request

private:
  CWsScreenDevice* iScreen;
  CWindowGc* iGc;

  CWindow *iWindow;

  RWsSession iWs;
  RWindowGroup iGroup;

  const TRect& iRect;

  friend class CWindow; // needs to get at session
};

//////////////////////////////////////////////////////////////////////////////
///////////////////////// CWindow declaration ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

class CWindow : public CBase
{
public:
  CWindow(CWsClient* aClient);
  void ConstructL (const TRect& aRect);
  ~CWindow();

public:
  // access
  RWindow& Window(); // our own window
  // drawing
  void Draw(const TRect& aRect);

private:
  CWindowGc* SystemGc(); // system graphics context

private:
  RWindow iWindow; // window server window
  TRect iRect; // rectangle re owning window
private:
  CWsClient* iClient; // client including session and group
};

#endif // __MY_WINDOW_H__

// ================= End of Window.h =======================



// ================= Start of Window.cpp =======================
// Window.cpp
//

#include <w32std.h>
#include <coedef.h>
#include "Window.h"

///////////////////////////////////////////////////////////////////////////////
////////////////////////// CWindow implementation /////////////////////////////
///////////////////////////////////////////////////////////////////////////////

CWindow::CWindow(CWsClient* aClient): iClient(aClient)
{
}

void CWindow::ConstructL (const TRect& aRect)
{
  // Use the window group for parent window
  RWindowTreeNode* parent= &(iClient->iGroup);
  iWindow=RWindow(iClient->iWs); // use app's session to window server
  User::LeaveIfError(iWindow.Construct(*parent,(TUint32)this));
  iRect = aRect;
  iWindow.SetExtent(iRect.iTl, iRect.Size()); // set extent relative to group coords
  iWindow.Activate(); // window is now active
}

CWindow::~CWindow()
{
  iWindow.Close(); // close our window
}

RWindow& CWindow::Window()
{
  return iWindow;
}

CWindowGc* CWindow::SystemGc()
{
  return iClient->iGc;
}

/****************************************************************************\
| Function: CWindow::Draw
| Purpose: Redraws the contents of CSmallWindow within a given
| rectangle. CSmallWindow displays a square border around
| the edges of the window, and two diagonal lines between the
| corners.
| Input: aRect Rectangle that needs redrawing
| Output: None
\****************************************************************************/
void CWindow::Draw(const TRect& aRect)
{
  // Drawing to a window is done using functions supplied by
  // the graphics context (CWindowGC), not the window.
  CWindowGc* gc = SystemGc(); // get a gc
  gc->SetClippingRect(aRect); // clip outside this rect
  gc->Clear(aRect); // clear
  TSize size=iWindow.Size();
  TInt width=size.iWidth;
  TInt height=size.iHeight;
  // Draw a square border
  gc->DrawLine(TPoint(0,0),TPoint(0,height-1));
  gc->DrawLine (TPoint (0, height-1), TPoint (width-1, height-1));
  gc->DrawLine(TPoint(width-1,height-1),TPoint(width-1,0));
  gc->DrawLine (TPoint (width-1, 0), TPoint (0, 0));
  // Draw a line between the corners of the window
  gc->DrawLine(TPoint(0,0),TPoint(width, height));
  gc->DrawLine (TPoint (0, height), TPoint (width, 0));
}


/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// CWsClient implementation ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CWsClient* CWsClient::NewL(const TRect& aRect)
{
  // make new client
  CWsClient* client=new (ELeave) CWsClient(aRect);
  CleanupStack::PushL(client); // push, just in case
  client->ConstructL(); // construct and run
  CleanupStack::Pop();
  return client;
}

CWsClient::CWsClient(const TRect& aRect)
: CActive(CActive::EPriorityHigh),
iRect(aRect)
{
}

void CWsClient::ConstructL()
{
  // add ourselves to active scheduler
  CActiveScheduler::Add(this);
  // get a session going
  User::LeaveIfError(iWs.Connect());
  // construct our one and only window group
  iGroup=RWindowGroup(iWs);
  User::LeaveIfError(iGroup.Construct(2,ETrue)); // meaningless handle; enable focus
  // construct screen device and graphics context
  iScreen=new (ELeave) CWsScreenDevice(iWs); // make device for this session
  User::LeaveIfError(iScreen->Construct()); // and complete its construction
  User::LeaveIfError(iScreen->CreateContext(iGc));// create graphics context

  iWindow = new (ELeave) CWindow (this);
  iWindow->ConstructL(iRect);

  // 窗口始終在最上層
  iGroup.SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
  // 禁止接受焦點(diǎn)
  iGroup.EnableReceiptOfFocus(EFalse);
  // Set the window is non-fading
  iGroup.SetNonFading(ETrue);

  // 將窗口提到前面
  TApaTask task(iWs);
  task.SetWgId(iGroup.Identifier());
  task.BringToForeground();

  // request first event and start scheduler
  IssueRequest();
}

CWsClient::~CWsClient()
{
  // neutralize us as an active object
  Deque(); // cancels and removes from scheduler
  // get rid of everything we allocated
  delete iGc;
  delete iScreen;
  delete iWindow;
 
  // destroy window group
  iGroup.Close();
  // finish with window server
  iWs.Close();
}

void CWsClient::IssueRequest()
{
  iWs.RedrawReady(&iStatus); // request redraw
  SetActive(); // so we're now active
}

void CWsClient::DoCancel()
{
  iWs.RedrawReadyCancel(); // cancel redraw request
}

/****************************************************************************\
| Function: CWsClient::RunL()
| Called by active scheduler when an even occurs
| Purpose: do Redraw
\****************************************************************************/
void CWsClient::RunL()
{
  // find out what needs to be done
  TWsRedrawEvent redrawEvent;
  iWs.GetRedraw(redrawEvent); // get event
  CWindow* window=(CWindow*)(redrawEvent.Handle()); // get window
  if (window)
  {
    TRect rect=redrawEvent.Rect(); // and rectangle that needs redrawing
    // now do drawing
    iGc->Activate(window->Window());
    window->Window().BeginRedraw(rect);
    window->Draw(rect);
    window->Window().EndRedraw();
    iGc->Deactivate();
  }
  // maintain outstanding request
  IssueRequest(); // maintain outstanding request
}
// ================= End of Window.cpp =======================

上面的代碼只是一個(gè)最基礎(chǔ)的框架,你可以自己添更多的東西。比如顯示一些文字。不過要顯示文字就要先設(shè)定字體,具體操作如下:
先要建立一個(gè)CWsScreenDevice:
iScreen = new (ELeave) CWsScreenDevice(iWs);

然后可以用GetNearestFontInTwips通過字體名字獲得CFont:
_LIT(FONT_CH16, "CombinedChinesePlain16");
TFontSpec myFontSpec(FONT_CH16, 200);
iScreen->GetNearestFontInTwips(iFont, myFontSpec);



再補(bǔ)充兩點(diǎn):
1. 如何在手機(jī)上運(yùn)行exe程序
可以有幾種方法,一種是通過文件管理器直接執(zhí)行這個(gè)exe,這種方法通常在開發(fā)階段使用,因?yàn)橐層脩暨@么操作,用戶會(huì)覺得很不方便;第二種是通過app 來調(diào)用exe;第三種是利用mdl在開機(jī)階段就調(diào)用exe。后兩種的方法是類似的,都是通過CApaCommandLine來實(shí)現(xiàn),具體的代碼可以參考:
http://discussion.forum.nokia.com/forum/showthread.php?t=66477

2. 如何終止exe程序
開發(fā)階段,我們可以借助TaskSpy等工具,當(dāng)然也可以通過我們的App來終止exe進(jìn)程。具體的方法如下:首先要找到符合名稱得進(jìn)程,然后將其kill

_LIT(KPROCESSNAME, "myexe*"); // 進(jìn)程名稱,別忘了最后面的匹配字符*
void KillExeL()
{
  TInt Err;
  TFullName processName;
  TFindProcess findProcess(KPROCESSNAME);
  while (ETrue)
  {
    findProcess.Next(processName);
    if (processName != KNullDesC) // 找到符合條件的進(jìn)程
    {
      RProcess aProcess;
      Err = aProcess.Open(findProcess, EOwnerProcess);
      if (Err == KErrNone)
      {
        aProcess.Kill(0); // kill該進(jìn)程
      }
      aProcess.Close();
    } else
      break;
  }
}

1. 新的調(diào)試方法
在手機(jī)上調(diào)試exe程序還是一個(gè)比較麻煩的事情,前面介紹了console,但是有時(shí)候不方便用console,這時(shí)候就要換一種方法來記錄信息,比較簡 單的就是用文件記錄,這個(gè)方法的缺點(diǎn)是不能實(shí)時(shí)察看,另外一個(gè)缺點(diǎn)就是要消耗較多的時(shí)間,別看這點(diǎn)時(shí)間,有時(shí)候就會(huì)掩蓋一些問題。我就遇到過,不過可以通 過其他的辦法來解決。
這里給出一段我用的代碼供大家參考。因?yàn)槭钦{(diào)試代碼,所以寫的并不是很完善,要求字符串不能含中文:
void WriteTestInfoL(const TDesC& infostr)
{
  RFs aSession;
  aSession.Connect();

  TFileName *fname = new (ELeave) TFileName;
  CleanupStack::PushL(fname);
  fname->Copy(_L("c:\\testinfo.txt"));

  RFile aTestFile;
  TInt err = aTestFile.Open(aSession, *fname, EFileWrite);
  if (err == KErrNotFound) // 沒有此文件
  {
    err = aTestFile.Create(aSession, *fname, EFileWrite);
  }
  CleanupStack::PopAndDestroy();

  if (err == KErrNone)
  {
    TInt pos = 0;
    aTestFile.Seek(ESeekEnd, pos); // 在最后添加
    TBuf8<50> aText;
    for (TInt i=0; i<infostr.Length(); i++)
    {
      aText.Append(infostr[i] & 0xFF); // 16bit簡單轉(zhuǎn)8bit
    }

    aTestFile.Write(aText, aText.Size());
    aTestFile.Write(_L8("\r\n"), 2); // 添加一個(gè)換行
  }
  aTestFile.Close();
  aSession.Close();
}

這段代碼每調(diào)用一次,就會(huì)向c:\testinfo.txt中添加一行字符串。你可以在手機(jī)上用記事本直接打開察看。
前面提到的時(shí)間占用問題如何解決呢?
也很簡單,在你對時(shí)間有要求的地方定義一片緩存,把信息先放到緩存里,等到過了這個(gè)地方,再將緩存里的數(shù)據(jù)寫入文件。用這個(gè)方法還可以寫入數(shù)字等內(nèi)容。
代碼類似于:
TBuf<100> tempstr;
......
tempstr.Append(myinfo);
tempstr.Append(_L("\r\n")); // 換行
......
tempstr.AppendFormat(_L("a=%d, b=%d\r\n"), a, b);
......
......
WriteTestInfoL(tempstr);


通過這個(gè)方法調(diào)試還是幫我解決了不少問題的。



posted on 2007-08-27 17:46 Khan 閱讀(2642) 評論(2)  編輯 收藏 引用 所屬分類: GCC/G++

評論

# re: 關(guān)于exe形式編程的一點(diǎn)心得,希望對大家有所幫助(轉(zhuǎn)載自nokia forum)  回復(fù)  更多評論   

謝謝這篇文章,在我最困惑的時(shí)候幫了我。
2007-12-29 15:51 | andy liu

# re: 關(guān)于exe形式編程的一點(diǎn)心得,希望對大家有所幫助(轉(zhuǎn)載自nokia forum)  回復(fù)  更多評論   

感覺文章作者的功力很深厚
2008-08-29 13:50 | juniorhope
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本久久综合亚洲鲁鲁| 夜夜嗨网站十八久久 | 亚洲精品国产精品国自产观看浪潮 | 国产亚洲一区二区精品| 欧美日韩精品一区二区三区四区| 久久不射2019中文字幕| 久久国产欧美精品| 久久婷婷一区| 欧美成人一区二区| 欧美日韩在线播| 欧美午夜精品理论片a级按摩| 欧美视频免费| 国内欧美视频一区二区| 亚洲精选视频在线| 欧美在线高清| 亚洲国产美国国产综合一区二区| 99在线精品视频| 久久久五月婷婷| 国产精品v日韩精品| 亚洲第一在线视频| 中文在线一区| 欧美国产亚洲精品久久久8v| 日韩天天综合| 久久亚洲影院| 欧美国产高潮xxxx1819| 亚洲人精品午夜| 久久久久国产免费免费| 国产精品videosex极品| 亚洲精品中文字| 久久一日本道色综合久久| 亚洲精品国产精品国自产观看| 久久精品99久久香蕉国产色戒| 欧美日韩一区二区三区高清| 在线观看av不卡| 欧美一级黄色录像| 亚洲欧美日韩中文在线制服| 国产精品久久久久影院亚瑟| 亚洲少妇中出一区| 日韩视频在线播放| 国产精品大全| 久久全球大尺度高清视频| 午夜一区二区三区不卡视频| 欧美日韩精品免费观看视一区二区 | 亚洲一级高清| 国产午夜精品麻豆| 免费久久99精品国产自在现线| 欧美一区二区三区四区夜夜大片| 欧美日韩一区在线播放| 久久久在线视频| 免费av成人在线| 亚洲视频你懂的| 香蕉乱码成人久久天堂爱免费| 一区二区三区自拍| 一区二区三区免费网站| 在线不卡a资源高清| 亚洲美女淫视频| 午夜久久久久久| 伊人成人网在线看| 一本色道久久综合亚洲精品婷婷 | 99热在线精品观看| 亚洲欧美激情视频在线观看一区二区三区 | 99精品欧美一区二区三区| 国产一区二区日韩| 亚洲精品网址在线观看| 国内精品久久久久久| 亚洲网在线观看| 亚洲视频欧美视频| 欧美日韩国产黄| 亚洲日本精品国产第一区| 在线看一区二区| 久久亚洲精选| 欧美jizz19hd性欧美| 国产小视频国产精品| 中文欧美字幕免费| 亚洲性感激情| 国产欧美一区二区三区国产幕精品| 日韩午夜在线观看视频| 一道本一区二区| 欧美日韩中文在线| 亚洲午夜黄色| 欧美一级大片在线观看| 国产欧美日韩免费看aⅴ视频| 亚洲深夜福利网站| 久久久www成人免费无遮挡大片 | 久久久亚洲欧洲日产国码αv| 亚洲你懂的在线视频| 国产精品美女久久久久av超清| 亚洲国产精品一区制服丝袜| 日韩一级精品视频在线观看| 欧美理论电影网| 亚洲视频在线看| 蜜臀av一级做a爰片久久| 亚洲精品永久免费| 欧美日韩国产页| 久久久精品国产免大香伊| 蜜桃久久av| 久久久久久成人| av成人免费在线| 狠狠色丁香婷婷综合| 欧美午夜视频在线| 久久精品国产久精国产爱| 日韩亚洲一区二区| 亚洲国产精品免费| 免费在线亚洲| 免费精品视频| 久久久亚洲国产天美传媒修理工| 在线亚洲伦理| 亚洲人永久免费| 激情五月综合色婷婷一区二区| 国产精品久久久久久久9999| 欧美日韩国产首页在线观看| 久久性色av| 蜜臀va亚洲va欧美va天堂 | 欧美激情bt| 麻豆av一区二区三区| 久久只精品国产| 欧美国产视频在线| 91久久午夜| 亚洲伦理在线| 先锋亚洲精品| 久久免费99精品久久久久久| 亚洲调教视频在线观看| 亚洲欧美激情视频在线观看一区二区三区| 亚洲国产日韩综合一区| 亚洲精品一区在线观看香蕉| 亚洲色在线视频| 欧美一区二区三区在线视频 | 久久久久综合网| 久久婷婷麻豆| 99精品国产高清一区二区| 亚洲一区在线播放| 欧美国产欧美综合| 国产免费成人| 亚洲作爱视频| 免费成人性网站| 夜夜嗨av色综合久久久综合网| 亚洲综合视频网| 欧美揉bbbbb揉bbbbb| 亚洲国产成人在线| 欧美在线视频在线播放完整版免费观看| 久久久人人人| 亚洲欧美一区二区视频| 国产精品一卡| 欧美一区二区在线免费观看 | 香蕉乱码成人久久天堂爱免费 | 亚洲网站视频福利| 一区二区三区日韩精品视频| 久久精品国产久精国产爱| 欧美色中文字幕| 亚洲午夜精品久久久久久浪潮 | 免费亚洲一区| 亚洲免费大片| 国产精品第十页| 亚洲精品在线免费观看视频| 欧美激情一区二区三区不卡| 欧美日韩妖精视频| 性色av一区二区怡红| 亚洲一品av免费观看| 国产日韩欧美视频| 久久字幕精品一区| 欧美激情亚洲自拍| 性色一区二区| 亚洲欧美日韩国产另类专区| 亚洲欧洲另类国产综合| 午夜精品久久久久久| 亚洲视频在线观看| 欧美国内亚洲| 久久九九国产精品| 国产精品伊人日日| 亚洲精品久久久蜜桃| 国产精品自拍网站| 一本色道久久综合亚洲精品高清| 亚洲国产成人tv| 久久久久.com| 久久亚洲私人国产精品va媚药| 国产精品二区三区四区| 日韩视频永久免费观看| 亚洲欧洲精品一区二区三区波多野1战4| 午夜日韩av| 久久夜色精品| 精品白丝av| 欧美主播一区二区三区| 久久国产欧美日韩精品| 国产欧美日韩在线| 久久久精品国产免费观看同学 | 国产精品日韩久久久| 亚洲国产天堂久久综合| 欧美一区久久| 欧美激情第一页xxx| 欧美一级免费视频| 一二三区精品福利视频| 国内精品久久久| 国产女人精品视频| 久久综合色一综合色88| 亚洲精品日韩激情在线电影| 欧美一区二区大片| 狠狠爱成人网| 国产日韩欧美综合在线| 欧美精品日韩综合在线| 亚洲一区二区视频在线观看|