亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 標準mfc winsock activex控件開發實例.htm

?? MFC WinSock ActiveX控件開發實例
?? HTM
字號:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>
      <p align="center"><b>標準MFC  WinSock  ActiveX控件開發實例<br>
      </b><br><br>
      作者:<a href="mailto:huang_hui@163.com">小輝</a></p>
      <p><a href="MFCWinSock.rar">下載源代碼</a></p>
        
      <p><br><br>
      <b>摘要</b>:本文主要介紹如何開發一個ActiveX控件,提供接口,與相應事件掛鉤。文中涉及到VARIANT,SAFEARRAY,BSTR的詳細使用方法。<br>
      <t>另外還提供了WinSock的詳細開發步驟,以及如何響應網絡超時,網絡斷開的事件方法以及在VC,VB調用該控件的方法。<br></p>
      <b>關鍵字</b>:ActiveX,Socket,VARIANT, SAFEARRAY,BSTR。<br><br>
      <p><b>
      一、MFC ActiveX控件開發步驟(VC 6.0):</b></p>
          <OL>
          <LI>New->Projects->MFC ActiveX ControlWizard,然后輸入MFCWinSock工程名。如下圖:<br>
      <br>
      <img border="0" src="1.jpg" width="741" height="487"><br>
      圖一 創建工程<br>
      <br>
          <LI>一路狂按Next,直至Finsh出現,再按下OK,如下圖:<br></OL>
   <br>
      <img border="0" src="2.jpg" width="550" height="522"><br>
      圖二 創建完成<br>
      <br>
      <p><b>
      二、架設Socket環境:</b></p>
          <OL>
          <LI>首先在StdAfx.h文件中加入下面這句代碼:
              <pre>#include <afxsock.h>		// MFC socket extensions <br></pre>
          <LI>打開MFCWinSock.cpp文件,添加代碼,看起來如下:</OL>
              <pre>
////////////////////////////////////////////////////////////////////////////
// CMFCWinSockApp::InitInstance - DLL initialization

BOOL CMFCWinSockApp::InitInstance()
{
	BOOL bInit = COleControlModule::InitInstance();

	if (bInit)
	{
		// TODO: Add your own module initialization code here.
		if (!AfxSocketInit())
		{
			AfxMessageBox("無法初始化Socket,請檢查!");
			return FALSE;
		}
		WSADATA wsaData;
		WORD wVersion = MAKEWORD(1, 1);//設定為Winsock 1.1版
		int errCode;		
		errCode = WSAStartup(wVersion, &wsaData);//啟動Socket服務
		if (errCode)
		{
			AfxMessageBox("無法找到可以使用的 WSOCK32.DLL");
			return FALSE;
		}
	}

	return bInit;
}


////////////////////////////////////////////////////////////////////////////
// CMFCWinSockApp::ExitInstance - DLL termination

int CMFCWinSockApp::ExitInstance()
{
	// TODO: Add your own module termination code here.
	WSACleanup();//結束網絡服務
	return COleControlModule::ExitInstance();
}
      <br></pre>
      <p><b>
      三,提供控件接口和事件</b></p>
      <OL>
      <LI>在MFCWinSockCtl.cpp加入如下代碼:<br>
      <pre>
#ifndef WM_MYWINSOCK 
#define WM_MYWINSOCK WM_USER+1888
#endif
      <br></pre>
      <LI>View->ClassWizard->Automation->Add Method…如下圖:<br><br>
      <img border="0" src="3.jpg" width="829" height="546"><br>
      圖三 創建接口<br>
      這個時候,我們為這個控件添加了一個Connect()的接口,出于通用性,安全性和擴展性的考慮,我們采用了VARIANT類型的參數,<br>
很多人可能都不太了解該類型,又或者有接觸過,但被嚇怕了,那么我們來看清它的本來面目:<br>
      <pre>
struct  tagVARIANT
    {
    union 
        {
        struct  __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown __RPC_FAR *punkVal;
                IDispatch __RPC_FAR *pdispVal;
                SAFEARRAY __RPC_FAR *parray;
                BYTE __RPC_FAR *pbVal;
                SHORT __RPC_FAR *piVal;
                LONG __RPC_FAR *plVal;
                FLOAT __RPC_FAR *pfltVal;
                DOUBLE __RPC_FAR *pdblVal;
                VARIANT_BOOL __RPC_FAR *pboolVal;
                _VARIANT_BOOL __RPC_FAR *pbool;
                SCODE __RPC_FAR *pscode;
                CY __RPC_FAR *pcyVal;
                DATE __RPC_FAR *pdate;
                BSTR __RPC_FAR *pbstrVal;
                IUnknown __RPC_FAR *__RPC_FAR *ppunkVal;
                IDispatch __RPC_FAR *__RPC_FAR *ppdispVal;
                SAFEARRAY __RPC_FAR *__RPC_FAR *pparray;
                VARIANT __RPC_FAR *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                INT intVal;
                UINT uintVal;
                DECIMAL __RPC_FAR *pdecVal;
                CHAR __RPC_FAR *pcVal;
                USHORT __RPC_FAR *puiVal;
                ULONG __RPC_FAR *pulVal;
                INT __RPC_FAR *pintVal;
                UINT __RPC_FAR *puintVal;
                struct  __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo __RPC_FAR *pRecInfo;
                    }	__VARIANT_NAME_4;
                }	__VARIANT_NAME_3;
            }	__VARIANT_NAME_2;
        DECIMAL decVal;
        }	__VARIANT_NAME_1;
    };
      <br></pre>
      它先是一個結構體,里面有一個重要成員VARTYPE vt;vt即是指明當前的數據類型,比如整型或者字符型,當指明vt后,<br>
      后面看到各種變量類型包括在一個聯合體當中,也就是說指明vt后,你只能使用對應的其中之一變量類型。看著這眾多的各種不同<br>
      類型變量集中在一起,確實讓人嚇了一跳,但細細看來,大多數變量跟我們平時的用法相似。值得一提的是SAFEARRAY __RPC_FAR *parray;<br>
      也許有很多人還沒有接觸過SAFEARRAY類型的變量,SAFEARRAY實際上也是一個結構,大家可以參考MSDN,我也將在后面介紹它的具體使用方法。<br><br>
      <LI>用同樣的方法創建DisConnect()接口<br><br>
      <LI>創建兩個事件,FireCloseWinsock()響應網絡斷開事件,FireRecvSockEvent()響應網絡有數據到達的事件。創建方法如下圖:<br>
      <br><img border="0" src="4.jpg" width="740" height="491"><br>
      圖四 創建事件<br>
      <LI>重載控件消息處理函數WindowProc(),在View->ClassWizard中打開類向導,在消息映射中找到WindowProc,如下圖:
      <br><img border="0" src="5.jpg" width="740" height="491"><br>
      圖五 重載WindowProc()<br>
      </OL>
      <p><b>
      四、編寫代碼</b></p>
      <OL>
      <LI>編寫VariantToLong()轉換函數,該函數代碼如下:
      <pre>
//類型轉換,將VARIANT類型轉換成Long類型
long CMFCWinSockCtrl::VariantToLong(const VARIANT &var)
{
	long r;
	switch(var.vt)
	{
		case VT_UI2://USHORT
			r = var.uiVal;
			break;
		case VT_UI4://ULONG
			r = var.ulVal;
			break;
		case VT_INT://INT
			r = var.intVal;
			break;
		case VT_UINT://UINT
			r = var.uintVal;
			break;
		case VT_I4://LONG
			r = var.lVal;
			break;
		case VT_UI1://BYTE
			r = var.bVal;
			break;
		case VT_I2://SHORT
			r = var.iVal;
			break;
		case VT_R4://FLOAT
			r = (long)var.fltVal;
			break;
		case VT_R8://DOUBLE
			r = (long)var.dblVal;
			break;
		default:
			r = -1;//無法轉換該值
			break;
	}
	return r;
}

      </pre>
      大家可以看到,該函數將最基本的若干中數據類型轉換成了long類型,但VARIANT決不是個簡單的譜,我將在后面繼續揭開它的神秘面紗.<br>
      <LI>編寫我們剛才的接口Connect(),代碼代碼如下:
       在MFCWinSockCtrl.h中加入
      <pre>
SOCKET OnlySock;//建立的唯一Socket,不允許重復建立多個
bool isOnlyConnect;//是否建立了連接
      </pre>
       然后再編寫Connect(),看起來如下:
      <pre>
BOOL CMFCWinSockCtrl::Connect(const VARIANT FAR& RemoteHost, const VARIANT FAR& RemotePort) 
{
	// TODO: Add your dispatch handler code here
	if(isOnlyConnect)//該連接已建立,還沒有斷開
		return FALSE;

	CString IPAddress;
	int Port;//轉換成整型的端口

	switch(RemoteHost.vt)
	{
		case VT_BSTR://字符串型
			IPAddress = CString(RemoteHost.bstrVal);
			break;
		case VT_BYREF|VT_I1://CHAR *
			IPAddress.Format("%s",RemoteHost.pcVal);//RemoteHost.pbstrVal);
			break;
		default:
			IPAddress = "";
			return FALSE;
	}

	Port = VariantToLong(RemotePort);//我們編寫的一個VARIANT轉換成long類型的函數
	if(Port<=0)
		return FALSE;

	_TCHAR *ip = 0;
	struct hostent *host = 0;
	struct sockaddr_in addr;
	ULONG dotIP = inet_addr(IPAddress);

	OnlySock = socket(AF_INET, SOCK_STREAM, 0);

	// 判斷是否為點IP地址格式
    	if (OnlySock == INVALID_SOCKET)
	{
		shutdown(OnlySock, 0x02);
		closesocket(OnlySock);//釋放占有的SOCK資源
		return FALSE;
	}

    memset(&addr, 0, sizeof(struct sockaddr_in));
    // 設定 SOCKADDR_IN 結構的內容
    // 如果通訊協議是選擇IP Protocol,那此值固定為AF_INET
    // AF_INET 與 PF_INET 這兩個常量值相同
    addr.sin_family = AF_INET;
    addr.sin_port = htons(Port);
    addr.sin_addr.S_un.S_addr = dotIP;
    if (dotIP == INADDR_NONE)
    {
        host = gethostbyname(IPAddress);
        if (!host)
        {
		shutdown(OnlySock, 0x02);
		closesocket(OnlySock);//釋放占有的SOCK資源
		return FALSE;
        };
        ip = inet_ntoa(*(struct in_addr*)(*host->h_addr_list));
        addr.sin_addr.S_un.S_addr = inet_addr(ip);
    }

    //開始連線
    if (connect(OnlySock, (LPSOCKADDR)&addr, sizeof(SOCKADDR)))
    {
        shutdown(OnlySock, 0x02);
	closesocket(OnlySock);//釋放占有的SOCK資源
	return FALSE;
    }

	int   iError = WSAAsyncSelect(OnlySock, m_hWnd,WM_MYWINSOCK, FD_READ|FD_CLOSE); //只對網絡斷開和數據到達通知感興趣
	if(iError == SOCKET_ERROR)//無法綁定Winsock的事件通知
	{   
		shutdown(OnlySock, 0x02);
		closesocket(OnlySock);//釋放占有的SOCK資源
		return FALSE;
	}  

	isOnlyConnect = true;
	return TRUE;
}
      </pre>
      有必要提一下WSAAsyncSelect(),這里接收網絡數據到達和斷開的兩個消息,我們收到WM_MYWINSOCK消息時將處理該消息并作為事件傳送給調用者.<br>
      第二個參數,窗口句柄,我們傳送了m_hWnd,這是因為MFC ActiveX也屬于一個窗口,并且是可見的,因此可以成功。<br>
      <LI>編寫WindowProc(),代碼看起來如下:
      <pre>
LRESULT CMFCWinSockCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch(message)
	{
	case WM_MYWINSOCK://響應自定義的消息
		switch(WSAGETSELECTEVENT(lParam))
		{
		case FD_READ://有新數據到達
			FireRecvSockEvent();
			break;
		case FD_CLOSE://對方已斷掉當前連接
			FireCloseWinsock();
			break;	
		}
		break;
		default:
			break;
	}
	return COleControl::WindowProc(message, wParam, lParam);
}
      </pre>
      </OL>
    <p><b>本部分結束語:</b>
    </p>
    好了,現在一個可以運行的控件已經完成,里面提供有Connect()和DisConnect()接口,和RecvSockEvent()及CloseWinsock()事件。以及WinSock的使用方法。<br>
    在下一部分(高級篇)將講解兩個重要接口SendData()和GetData(),下期內容如下:
    <OL>
    <LI>long SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType,const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) <br>
    <LI>long GetData(VARIANT FAR* Data, const VARIANT FAR& DataType, const VARIANT FAR& DataMaxLength, const VARIANT FAR& TimeOut) <br>
    <LI>VARIANT和SAFEARRAY的復雜用法。<br>
    <LI>控件開發出來后在VC和VB環境下的使用方法。<br>
    </OL>
    <p><b>
    聲明:</b>
    <OL>
    <LI>部分資料來源于網絡,本文所用的所有源代碼僅供非商業用途,并請保留原版權,否則后果自負!<br>
    <LI>歡迎大家拍磚,或指正不足的地方,一起探導更好的方法。
    <LI>歡迎訪問<a href="http://www.vcfans.cn">www.vcfans.cn</a>,感謝您的支持!<br>
    </OL>
    </p>
    </td>
  </tr>
</table>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av电影在线| 日韩一区有码在线| 久久狠狠亚洲综合| 日韩精品一区二区三区视频在线观看 | 亚洲韩国一区二区三区| 欧美视频在线观看一区| 秋霞国产午夜精品免费视频| 日韩欧美美女一区二区三区| 国产成人精品一区二区三区网站观看| 国产日韩精品一区| 色噜噜狠狠成人网p站| 偷窥少妇高潮呻吟av久久免费| 欧美一区二区三区在| 国产成人精品综合在线观看 | 久久综合九色综合久久久精品综合| 黄色日韩三级电影| 中文字幕一区二区三区在线观看 | 国产亚洲自拍一区| 99久久久精品| 水蜜桃久久夜色精品一区的特点| 91精品国产91久久久久久一区二区 | 欧美日韩三级一区| 精品写真视频在线观看| 中文字幕在线一区| 欧美日韩国产中文| 国产成人精品网址| 亚洲国产一区在线观看| 久久久精品人体av艺术| 精品视频一区 二区 三区| 久久成人久久爱| 亚洲伦理在线精品| 精品电影一区二区| 欧美无砖专区一中文字| 国产成人免费视频网站| 首页综合国产亚洲丝袜| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲美女屁股眼交3| 精品国产乱码久久久久久图片 | 日韩一级成人av| 高潮精品一区videoshd| 五月婷婷激情综合| 国产精品视频九色porn| 欧美日本精品一区二区三区| 成人在线视频一区| 精品一区二区三区免费毛片爱| 亚洲色图.com| 国产欧美一区二区在线观看| 91精品婷婷国产综合久久竹菊| 99视频在线观看一区三区| 久久精品国内一区二区三区| 亚洲国产一区二区三区 | 91久久精品国产91性色tv| 国产精品一区二区久久不卡 | 日韩欧美在线一区二区三区| 在线精品视频免费播放| 成人激情小说乱人伦| 精品一区二区三区av| 日本 国产 欧美色综合| 一区二区成人在线视频| 国产精品高潮久久久久无| 国产日韩欧美精品在线| 欧美变态凌虐bdsm| 日韩三级中文字幕| 欧美日韩一区二区三区四区| 一本到不卡免费一区二区| yourporn久久国产精品| 风间由美一区二区av101| 激情av综合网| 久久99久久久久| 久久99最新地址| 免费高清在线视频一区·| 日韩高清电影一区| 午夜视频一区二区| 偷窥少妇高潮呻吟av久久免费| 亚洲国产精品一区二区尤物区| 亚洲国产色一区| 亚洲va在线va天堂| 五月激情综合婷婷| 日本成人在线网站| 卡一卡二国产精品 | 一本色道久久综合狠狠躁的推荐| 99亚偷拍自图区亚洲| 91免费观看视频| 欧美亚洲国产一区二区三区| 欧美久久一二区| 欧美一区永久视频免费观看| 欧美成va人片在线观看| 亚洲精品一区在线观看| 久久精品人人做人人综合| 中文字幕精品在线不卡| 国产精品不卡在线| 亚洲图片欧美色图| 麻豆精品视频在线观看免费| 国产精品1区2区| 不卡欧美aaaaa| 色播五月激情综合网| 777奇米成人网| 久久久久久9999| 亚洲美女屁股眼交3| 天堂成人国产精品一区| 国产电影一区二区三区| 91丝袜呻吟高潮美腿白嫩在线观看| 日本黄色一区二区| 制服丝袜亚洲播放| 国产欧美一二三区| 亚洲伦理在线精品| 久久9热精品视频| 91免费版在线| 91精品国产综合久久久久久久 | 91首页免费视频| 欧美日韩激情在线| 久久久亚洲午夜电影| 亚洲另类中文字| 久久国产生活片100| 91性感美女视频| 日韩欧美资源站| 日日噜噜夜夜狠狠视频欧美人| 美女免费视频一区二区| 97超碰欧美中文字幕| 欧美猛男男办公室激情| 国产欧美一区二区精品忘忧草 | 成人性视频免费网站| 色综合久久久久网| 欧美mv日韩mv国产网站| 亚洲午夜在线观看视频在线| 国产精品1024久久| 91精品国产色综合久久久蜜香臀| 日本一区二区三区高清不卡 | 亚洲制服欧美中文字幕中文字幕| 久久国产乱子精品免费女| 日本精品一级二级| 亚洲国产精品成人综合| 青青国产91久久久久久| 91麻豆高清视频| 国产喷白浆一区二区三区| 日本中文一区二区三区| 99久久精品免费看| 2023国产精华国产精品| 日韩国产精品大片| 成人av网站免费| 欧美不卡一二三| 日本视频中文字幕一区二区三区| 成人av动漫在线| 欧美精品一区二区不卡| 亚洲成人在线观看视频| 91美女在线视频| 国产精品美女久久久久高潮| 狠狠色狠狠色合久久伊人| 欧美一区二区三区电影| 伊人夜夜躁av伊人久久| av色综合久久天堂av综合| 久久精品视频一区二区三区| 美国毛片一区二区三区| 欧美一区二区三区在线看| 亚洲成a人v欧美综合天堂| 色婷婷国产精品久久包臀| 国产精品美女久久久久aⅴ | 一级中文字幕一区二区| av不卡免费在线观看| 日本一区二区电影| 国产91丝袜在线播放0| 久久久五月婷婷| 国产在线国偷精品免费看| 欧美一区永久视频免费观看| 三级成人在线视频| 91超碰这里只有精品国产| 亚洲福利视频一区二区| 99久久婷婷国产综合精品电影 | 亚洲在线观看免费视频| 色婷婷av一区| 亚洲一二三四久久| 欧美天天综合网| 天堂影院一区二区| 欧美日韩国产综合久久| 奇米一区二区三区| 日韩精品中午字幕| 日韩高清一区二区| 精品国产成人系列| 国产成a人亚洲| 综合色中文字幕| 91久久免费观看| 性欧美大战久久久久久久久| 91精品蜜臀在线一区尤物| 激情av综合网| 亚洲欧洲成人自拍| 欧美日韩第一区日日骚| 免费久久99精品国产| 久久精品无码一区二区三区| 99久久伊人网影院| 亚洲国产wwwccc36天堂| 欧美一区二区免费观在线| 激情综合色综合久久| 中文字幕+乱码+中文字幕一区| 91麻豆免费在线观看| 午夜不卡av在线| 久久久久久电影| 在线日韩av片| 久久精品国产**网站演员| 国产精品麻豆久久久| 欧美精品在线观看播放|