锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍦╯tdafx.h
涓姞鍏ワ細
#undef WINVER
#define WINVER 0x0500
*************************************************************
#ifndef SM_CMONITORS
typedef HANDLE HMONITOR;
#endif
#ifndef DISPLAY_DEVICE_PRIMARY_DEVICE
typedef struct _DISPLAY_DEVICE {
DWORD cb;
TCHAR DeviceName[32];
TCHAR DeviceString[128];
DWORD StateFlags;
} DISPLAY_DEVICE, *PDISPLAY_DEVICE, *LPDISPLAY_DEVICE;
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001
#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002
#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004
#define DISPLAY_DEVICE_VGA 0x00000010
#endif
typedef BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD);
typedef BOOL (WINAPI* pEnumDisplaySettings)(PVOID,DWORD,PVOID);
pEnumDisplayDevices pStartEnumDisplayDevices;
pEnumDisplaySettings pStartEnumDisplaySettings;
*********************************************************************
int iCount;
pStartEnumDisplayDevices = (pEnumDisplayDevices)GetProcAddress(LoadLibrary("USER32"), "EnumDisplayDevicesA");
pStartEnumDisplaySettings = (pEnumDisplaySettings)GetProcAddress(LoadLibrary("USER32"), "EnumDisplaySettingsA");
if (pStartEnumDisplayDevices && pStartEnumDisplaySettings)
{
DISPLAY_DEVICE dd;
DEVMODE dv;
ZeroMemory(&dv, sizeof(dv));
ZeroMemory(&dd, sizeof(dd));
dv.dmSize = sizeof(dv);
dd.cb = sizeof(dd);
for (iCount=0; (*pStartEnumDisplayDevices)(NULL, iCount, &dd, 0); iCount++)
{
(*pStartEnumDisplaySettings)(dd.DeviceName,ENUM_CURRENT_SETTINGS,&dv);
if((dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
&&(dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
{
CString strDispName,strScreen,strColor,strFreq;
strDispName.Format(_T("Device Name: %s "),dd.DeviceString);
SetDlgItemText(IDC_STATIC_DISP_NAME,strDispName);
strScreen.Format(_T("%d脳%d "),dv.dmPelsWidth,dv.dmPelsHeight);
SetDlgItemText(IDC_STATIC_FREQ,strScreen);
strColor.Format(_T("%d Bit"),dv.dmBitsPerPel);
SetDlgItemText(IDC_STATIC_COLOR,strColor);
strFreq.Format(_T("%d Hz"),dv.dmDisplayFrequency);
SetDlgItemText(IDC_STATIC_REFRESH_FREQ,strFreq);
}
}
}
]]>
璺熻釜紼嬪簭鍒?/span> _heap_alloc_dbg
void * __cdecl _heap_alloc_dbg(
聽 聽 聽 聽 size_t nSize,
聽 聽 聽 聽 int nBlockUse,
聽 聽 聽 聽 const char * szFileName,
聽 聽 聽 聽 int nLine
聽 聽 聽 聽 )
{
聽 聽 聽 聽 long lRequest;
聽 聽 聽 聽 size_t blockSize;
聽 聽 聽 聽 int fIgnore = FALSE;
聽 聽 聽 聽 _CrtMemBlockHeader * pHead;
聽 聽 聽 聽 /* verify heap before allocation */
聽 聽 聽 聽 if (_crtDbgFlag & _CRTDBG_CHECK_ALWAYS_DF)
聽 聽 聽 聽 聽 聽 _ASSERTE(_CrtCheckMemory());
聽 聽 聽 聽 lRequest = _lRequestCurr;
聽 聽 聽 聽 /* break into debugger at specific memory allocation */
聽 聽 聽 聽 if (lRequest == _crtBreakAlloc)
聽 聽 聽 聽 聽 聽 _CrtDbgBreak();
// here is the place were the app stops
// ... function continuous
聽
_crtBreakAlloc
涓?/span>
-1
銆?/span>
lRequest
涓?/span>
long
鍨嬶紝姣?/span>
new
涓嬈★紝
_lRequestCurr
姣忚皟鐢ㄤ竴嬈?/span>
new
錛岃嚜鍔ㄥ姞
1
錛屽綋
2147483647
鍐嶅姞
1
鍙樻垚
-2147483648
錛屼竴鐩寸瘡鍔犲埌
-1
錛岀劧鍚庤皟鐢?/span>
_CrtDbgBreak()
錛屽嚭閿欍傜湅浼兼槸榪欎釜鍘熷洜錛屼負浜嗚繘涓姝ョ‘璁わ紝緙栧啓嫻嬭瘯紼嬪簭
class AA
{
聽聽聽聽聽聽 char aa1[10];
聽聽聽聽聽聽 char aa2[12];
};
聽
int main(int argc, char* argv[])
{
聽聽聽聽聽聽 AA *pp;
聽聽聽聽聽聽 while(1)
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 pp=new AA;
聽聽聽聽聽聽聽聽聽聽聽聽聽 delete pp;
聽聽聽聽聽聽 }
}
鍑犱釜灝忔椂鍚庡鐜頒簡姝ょ幇璞°?/span>
緗戜笂鏌ユ壘0X10212AD0 鏈夊涓嬬嚎绱細
http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_21088390.html
| .opt | 宸ョ▼鍏充簬寮鍙戠幆澧冪殑鍙傛暟鏂囦歡銆傚宸ュ叿鏉′綅緗瓑淇℃伅錛?/td> |
| .aps | (AppStudio File),璧勬簮杈呭姪鏂囦歡,浜岃繘鍒舵牸寮?涓鑸笉鐢ㄥ幓綆′粬. |
| .clw | ClassWizard淇℃伅鏂囦歡,瀹為檯涓婃槸INI鏂囦歡鐨勬牸寮?鏈夊叴瓚e彲浠ョ爺絀朵竴涓?鏈夋椂鍊機lassWizard鍑洪棶棰?鎵嬪伐淇敼CLW鏂囦歡鍙互瑙e喅.濡傛灉姝ゆ枃浠朵笉瀛樺湪鐨勮瘽,姣忔鐢–lassWizard鐨勬椂鍊欑粯鎻愮ず浣犳槸鍚﹂噸寤? |
| .dsp | (DeveloperStudio Project):欏圭洰鏂囦歡,鏂囨湰鏍煎紡,涓嶈繃涓嶇啛鎮夌殑璇濅笉瑕佹墜宸ヤ慨鏀?DSW(DeveloperStudio Workspace)鏄伐浣滃尯鏂囦歡,鍏朵粬鐗圭偣鍜孌SP宸笉澶? |
| .plg | 鏄紪璇戜俊鎭枃浠?緙栬瘧鏃剁殑error鍜寃arning淇℃伅鏂囦歡錛堝疄闄呬笂鏄竴涓猦tml鏂囦歡錛?涓鑸敤澶勪笉澶?鍦═ools->Options閲岄潰鏈変釜閫夐」鍙互鎺у埗榪欎釜鏂囦歡鐨勭敓鎴? |
| .hpj | (Help Project)鏄敓鎴愬府鍔╂枃浠剁殑宸ョ▼,鐢╩icrosfot聽 Help Compiler鍙互澶勭悊. |
| .mdp | (Microsoft DevStudio Project)鏄棫鐗堟湰鐨勯」鐩枃浠?濡傛灉瑕佹墦寮姝ゆ枃浠剁殑璇?浼氭彁紺轟綘鏄惁杞崲鎴愭柊鐨凞SP鏍煎紡. |
| .bsc | 鏄敤浜庢祻瑙堥」鐩俊鎭殑,濡傛灉鐢⊿ource Brower鐨勮瘽灝卞繀欏繪湁榪欎釜鏂囦歡.濡傛灉涓嶇敤榪欎釜鍔熻兘鐨勮瘽,鍙互鍦≒roject Options閲岄潰鍘繪帀Generate Browse Info File,鍙互鍔犲揩緙栬瘧閫熷害. |
| .map | 鏄墽琛屾枃浠剁殑鏄犲儚淇℃伅綰綍鏂囦歡,闄ら潪瀵圭郴緇熷簳灞傞潪甯哥啛鎮?榪欎釜鏂囦歡涓鑸敤涓嶇潃. |
| .pch | (Pre-Compiled File)鏄緙栬瘧鏂囦歡,鍙互鍔犲揩緙栬瘧閫熷害,浣嗘槸鏂囦歡闈炲父澶? |
| .pdb | (Program Database)璁板綍浜嗙▼搴忔湁鍏崇殑涓浜涙暟鎹拰璋冭瘯淇℃伅,鍦ㄨ皟璇曠殑鏃跺欏彲鑳芥湁鐢? |
| .exp | 鍙湁鍦ㄧ紪璇慏LL鐨勬椂鍊欐墠浼氱敓鎴?璁板綍浜咲LL鏂囦歡涓殑涓浜涗俊鎭?涓鑸篃娌′粈涔堢敤. |
| .ncb | 鏃犵紪璇戞祻瑙堟枃浠?no compile browser)銆傚綋鑷姩瀹屾垚鍔熻兘鍑洪棶棰樻椂鍙互鍒犻櫎姝ゆ枃浠躲俠uild鍚庝細鑷姩鐢熸垚銆?/td> |
鍩轟簬IP聽Multicast鐨勪紶杈撳拰瀹炵幇
聽
聽聽 鍓嶉潰璁ㄨ鐨勫紑鍙戠綉緇滈氫俊鐨勭粡鍏稿叆闂ㄩ噰鐢ㄧ殑鏄疻SAAsyncSelect鐨勫紓姝/O妯″瀷錛屾湰鏂囧皢璁ㄨWSAEventSelect寮傛I/O妯″瀷銆?
聽聽聽聽聽聽 WSAEventSelect妯″瀷鏈夌偣綾諱技WSAAsyncSelect妯″瀷錛屼笉鍚岀殑鏄粬涓嶆槸鐢ㄦ秷鎭槧灝勭殑鏂瑰紡鏉ュ搷搴旂綉緇滀簨浠訛紝鑰屾槸鐢ㄧ瓑寰呭閲嶄簨浠剁殑鏂瑰紡鏉ュ搷搴旂綉緇滀簨浠躲備笅闈㈡槸鐢╓SAEventSelect妯″瀷鍜屽綰跨▼鏈哄埗鍋氱殑涓涓畝鍗曠殑鏈嶅姟鍣ㄧ▼搴忕殑.cpp鍜?h鏂囦歡錛屽簲鐢ㄧ▼搴忓熀浜嶮FC鐨勬爣鍑嗗璇濇銆傚疄鐜版帴鍙楀涓鎴風鐨勮繛鎺ヨ姹傦紝騫惰褰曚笅鎵鏈夊鎴風鐨勭浉鍏充俊鎭紝鏄劇ず鍦ㄥ垪琛ㄦ涓?/p>
// serverDlg.cpp : implementation file
//
#include "stdafx.h"
#include "server.h"
#include "serverDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
SOCKET Accept; file://鐢?/font>浜庢柊鐨勪竴涓繛鎺ラ氫俊鐨勫鎺ュ瓧
WSAEVENT NewEvent; file://瀵?/font>搴斾簬鏂扮殑濂楁帴瀛楃殑鏂頒簨浠?br />SOCKET Socket[WSA_MAXIMUM_WAIT_EVENTS];聽 file://瀛?/font>鏀炬墍鏈夌敓鎴愮殑濂楁帴瀛?br />WSAEVENT Event[WSA_MAXIMUM_WAIT_EVENTS]; file://瀛?/font>鏀炬墍鏈夌敓鎴愮殑浜嬩歡瀵硅薄
int EventTotal; file://鍒?/font>寤虹殑浜嬩歡鎬繪暟
int Index;聽聽聽聽聽 file://絳?/font>寰呭閲嶄簨浠跺嚱鏁扮殑榪斿洖鍊?br />WSANETWORKEVENTS NetworkEvents; file://鐢?/font>浜庢帴鏀跺鎺ュ瓧涓婂彂鐢熺殑緗戠粶浜嬩歡綾誨瀷浠ュ強鍙兘鍑虹幇鐨勯敊
璇唬鐮?/p>
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
聽CAboutDlg();
// Dialog Data
聽file://{{AFX_DATA(CAboutDlg)
聽enum { IDD = IDD_ABOUTBOX };
聽file://}}AFX_DATA
聽// ClassWizard generated virtual function overrides
聽file://{{AFX_VIRTUAL(CAboutDlg)
聽protected:
聽virtual void DoDataExchange(CDataExchange* pDX);聽聽聽 // DDX/DDV support
聽file://}}AFX_VIRTUAL
// Implementation
protected:
聽file://{{AFX_MSG(CAboutDlg)
聽file://}}AFX_MSG
聽DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
聽file://{{AFX_DATA_INIT(CAboutDlg)
聽file://}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
聽CDialog::DoDataExchange(pDX);
聽file://{{AFX_DATA_MAP(CAboutDlg)
聽file://}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
聽file://{{AFX_MSG_MAP(CAboutDlg)
聽聽// No message handlers
聽file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerDlg dialog
CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
聽: CDialog(CServerDlg::IDD, pParent)
{
聽file://{{AFX_DATA_INIT(CServerDlg)
聽聽// NOTE: the ClassWizard will add member initialization here
聽file://}}AFX_DATA_INIT
聽// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
聽m_Connectnum = 0;
聽m_NetworkID = 0;
聽EventTotal = 0;
聽聽聽 for(int i = 0; i < MAX_CLIENT_NUM; i++)
聽{
聽聽ZeroMemory(&m_ClientInfo[i], sizeof(client_info));
聽}
聽m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CServerDlg::DoDataExchange(CDataExchange* pDX)
{
聽CDialog::DoDataExchange(pDX);
聽file://{{AFX_DATA_MAP(CServerDlg)
聽聽// NOTE: the ClassWizard will add DDX and DDV calls here
聽file://}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CServerDlg, CDialog)
聽file://{{AFX_MSG_MAP(CServerDlg)
聽ON_WM_SYSCOMMAND()
聽ON_WM_PAINT()
聽ON_WM_QUERYDRAGICON()
聽ON_WM_TIMER()
聽file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerDlg message handlers
BOOL CServerDlg::OnInitDialog()
{
聽CDialog::OnInitDialog();
聽// Add "About..." menu item to system menu.
聽// IDM_ABOUTBOX must be in the system command range.
聽ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
聽ASSERT(IDM_ABOUTBOX < 0xF000);
聽CMenu* pSysMenu = GetSystemMenu(FALSE);
聽if (pSysMenu != NULL)
聽{
聽聽CString strAboutMenu;
聽聽strAboutMenu.LoadString(IDS_ABOUTBOX);
聽聽if (!strAboutMenu.IsEmpty())
聽聽{
聽聽聽pSysMenu->AppendMenu(MF_SEPARATOR);
聽聽聽pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
聽聽}
聽}
聽// Set the icon for this dialog.聽 The framework does this automatically
聽//聽 when the application's main window is not a dialog
聽SetIcon(m_hIcon, TRUE);聽聽聽// Set big icon
聽SetIcon(m_hIcon, FALSE);聽聽// Set small icon
聽
聽// TODO: Add extra initialization here
聽WSADATA wsaData;
聽int ret;
聽ret = WSAStartup(MAKEWORD(2,2), &wsaData);
聽if(ret != 0)
聽{
聽聽MessageBox("鍒濆鍖栧鎺ュ瓧澶辮觸!");
聽聽return FALSE;
聽}
聽file://鍒?/font>寤轟竴涓鎺ュ瓧
聽m_ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
聽聽聽聽聽聽聽 if(m_ListenSocket == INVALID_SOCKET)
聽{
聽聽MessageBox("鍒涘緩濂楁帴瀛楀け璐?");
聽聽closesocket(m_ListenSocket);
聽聽WSACleanup();
聽聽return FALSE;
聽}
聽file://緇?/font>瀹氬埌鎸囧畾鐨勭鍙d笂
聽sockaddr_in localaddr;
聽localaddr.sin_family = AF_INET;
聽localaddr.sin_port = htons(1688);
聽localaddr.sin_addr.s_addr = 0;
聽if(bind(m_ListenSocket, (const struct sockaddr*)&localaddr, sizeof(sockaddr))
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 == SOCKET_ERROR)
聽{
聽聽MessageBox("緇戝畾鍦板潃澶辮觸!");
聽聽closesocket(m_ListenSocket);
聽聽WSACleanup();
聽聽return FALSE;
聽}
聽
聽NewEvent = WSACreateEvent(); file://鍒?/font>寤轟竴涓柊鐨勪簨浠跺璞?/p>
聽file://灝?/font>鍒涘緩鐨勪簨浠跺璞′笌鍓嶉潰鍒涘緩鐨勫鎺ュ瓧鍏寵仈鍦ㄤ竴璧?騫舵敞鍐岀綉緇滀簨浠剁被鍨?br />聽聽聽聽聽聽聽 if(WSAEventSelect(m_ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE) == SOCKET_ERROR)
聽{
聽聽MessageBox("娉ㄥ唽緗戠粶浜嬩歡澶辮觸!");
聽聽closesocket(m_ListenSocket);
聽聽WSACleanup();
聽聽return FALSE;
聽}
聽file://璁?/font>鍒涘緩鐨勫鎺ュ瓧澶勪簬鐩戝惉鐘舵?br />聽listen(m_ListenSocket, 5);
聽Event[EventTotal] = NewEvent;
聽Socket[EventTotal] = m_ListenSocket;
聽EventTotal++;
聽聽聽聽聽聽聽 file://璁?/font>緗甃ist鎺т歡鐨勫浘璞″垪琛?br />聽HICON hIcon;
聽m_imagelist.Create(16, 16, 0, 4, 4); // 32, 32 for large icons
聽hIcon = AfxGetApp()->LoadIcon(IDI_CLIENT_INFO);
聽
聽m_imagelist.SetBkColor (RGB(248,232,224));
聽m_imagelist.Add(hIcon);
聽pList = (CListCtrl*)GetDlgItem(IDC_CLIENT_INFO);
聽pList->SetImageList(&m_imagelist, LVSIL_SMALL);
聽pList->SetBkColor(RGB(248,232,224));
聽pList->SetTextBkColor(RGB(248,232,224));
聽pList->InsertColumn(0,"聽聽 瀹㈡埛鍚?,LVCFMT_CENTER,90, 0);
聽pList->InsertColumn(1,"緗戠粶ID",LVCFMT_CENTER,50,1);
聽pList->InsertColumn(2,"IP鍦板潃",LVCFMT_CENTER,100,2);
聽pList->InsertColumn (3,"鐧誨綍鏃墮棿",LVCFMT_CENTER,120,3);
聽pList->InsertColumn (4,"鍦ㄧ嚎鏃墮棿",LVCFMT_CENTER,100,4);
聽SetTimer(1, 1000, NULL);
聽file://鍚?/font>鍔ㄦ牳蹇冨鐞嗙嚎紼?br />聽AfxBeginThread(KernelWorkThread,this,THREAD_PRIORITY_NORMAL);
聽return TRUE;聽 // return TRUE聽 unless you set the focus to a control
}
void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
聽if ((nID & 0xFFF0) == IDM_ABOUTBOX)
聽{
聽聽CAboutDlg dlgAbout;
聽聽dlgAbout.DoModal();
聽}
聽else
聽{
聽聽CDialog::OnSysCommand(nID, lParam);
聽}
}
// If you add a minimize button to your dialog, you will need the code below
//聽 to draw the icon.聽 For MFC applications using the document/view model,
//聽 this is automatically done for you by the framework.
void CServerDlg::OnPaint()
{
聽if (IsIconic())
聽{
聽聽CPaintDC dc(this); // device context for painting
聽聽SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
聽聽// Center icon in client rectangle
聽聽int cxIcon = GetSystemMetrics(SM_CXICON);
聽聽int cyIcon = GetSystemMetrics(SM_CYICON);
聽聽CRect rect;
聽聽GetClientRect(&rect);
聽聽int x = (rect.Width() - cxIcon + 1) / 2;
聽聽int y = (rect.Height() - cyIcon + 1) / 2;
聽聽// Draw the icon
聽聽dc.DrawIcon(x, y, m_hIcon);
聽}
聽else
聽{
聽聽CDialog::OnPaint();
聽}
}
// The system calls this to obtain the cursor to display while the user drags
//聽 the minimized window.
HCURSOR CServerDlg::OnQueryDragIcon()
{
聽return (HCURSOR) m_hIcon;
}
file://鏍?/font>
蹇冨鐞嗙嚎紼? 鍝嶅簲騫跺鐞嗗悇縐嶇綉緇滀簨浠?br />UINT KernelWorkThread(LPVOID pParam)
{
聽int len = sizeof(sockaddr);
聽CServerDlg* dlg;
聽dlg = (CServerDlg*)pParam;
聽while(1)
聽{
聽聽聽聽聽聽聽聽 Index = WSAWaitForMultipleEvents(EventTotal, Event, FALSE, WSA_INFINITE, FALSE);
聽聽WSAEnumNetworkEvents(Socket[Index - WSA_WAIT_EVENT_0],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Event[Index - WSA_WAIT_EVENT_0],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 &NetworkEvents);
聽
聽聽if(NetworkEvents.lNetworkEvents & FD_ACCEPT)
聽聽file://榪?/font>鎺ヤ簨浠?br />聽聽{
聽聽聽if(NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
聽聽聽{
聽聽聽聽dlg->MessageBox("鎺ュ彈榪炴帴浜嬩歡澶辮觸!");
聽聽聽聽break;
聽聽聽}
聽聽聽Accept = accept(Socket[Index - WSA_WAIT_EVENT_0],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 (struct sockaddr*)&(dlg->clientaddr), &len);
聽聽聽if(Accept == INVALID_SOCKET)
聽聽聽{
聽聽聽聽dlg->MessageBox("鎺ュ彈榪炴帴澶辮觸!");
聽聽聽聽break;
聽聽聽}
聽聽聽
聽聽聽if(EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
聽聽聽{
聽聽聽聽dlg->MessageBox("榪炴帴涓暟婧㈠嚭,鎷掔粷鎺ュ彈!");
聽聽聽聽break;
聽聽聽}
聽聽聽NewEvent = WSACreateEvent();
聽聽聽if(WSAEventSelect(Accept, NewEvent, FD_READ | FD_WRITE | FD_CLOSE)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 == SOCKET_ERROR)
聽聽聽{
聽聽聽聽dlg->MessageBox("娉ㄥ唽緗戠粶浜嬩歡澶辮觸!");
聽聽聽聽closesocket(Accept);
聽聽聽聽break;
聽聽聽}
聽聽聽Event[EventTotal] = NewEvent;
聽聽聽Socket[EventTotal] = Accept;
聽聽聽EventTotal ++;
聽聽}
聽聽if(NetworkEvents.lNetworkEvents & FD_READ)
聽聽file://璇?/font>鍙栨暟鎹簨浠?br />聽聽{
聽聽聽if(NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
聽聽聽{
聽聽聽聽dlg->MessageBox("璇諱簨浠跺け璐?");
聽聽聽聽break;
聽聽聽}
聽聽聽if(dlg->OnReceive(Socket[Index - WSA_WAIT_EVENT_0]) == FALSE)
聽聽聽{
聽聽聽聽dlg->MessageBox("璇誨彇鏁版嵁澶辮觸!");
聽聽聽聽break;
聽聽聽}
聽聽}
聽聽if(NetworkEvents.lNetworkEvents & FD_CLOSE)
聽聽file://鍏?/font>闂鎺ュ瓧浜嬩歡
聽聽{
聽聽聽if(NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
聽聽聽{
聽聽聽聽dlg->MessageBox("鍏抽棴浜嬩歡澶辮觸!");
聽聽聽聽break;
聽聽聽}
聽聽聽if(dlg->OnClose(Socket[Index - WSA_WAIT_EVENT_0]) == FALSE)
聽聽聽{
聽聽聽聽dlg->MessageBox("鍏抽棴濂楁帴瀛楀け璐?");
聽聽聽聽break;
聽聽聽}
聽聽}
聽}
聽return 0;
}
BOOL CServerDlg::OnClose(SOCKET pSocket)
{
聽int i, exitnum;
聽
聽for(i = 0; i < m_Connectnum; i++)
聽{
聽聽if(m_ClientInfo[i].Client_Socket == pSocket)
聽聽{
聽聽聽exitnum = i;
聽聽}
聽}
聽for(i = exitnum; i < m_Connectnum; i++)
聽{
聽聽memcpy(&m_ClientInfo[i], &m_ClientInfo[i+1], sizeof(client_info));
聽}
聽m_Connectnum --;
聽file://鍚?/font>鎵鏈夊鎴風鍙戦佸湪綰垮鎴蜂俊鎭殑鎶ユ枃
聽cmd_client_info ClientInfo;
聽ClientInfo.cmd_type = CMD_CLIENT_INFO;
聽ClientInfo.client_num = m_Connectnum;
聽
聽for(i=0; i<=m_Connectnum; i++)
聽{
聽聽ClientInfo.Networks_ID[i] = m_ClientInfo[i].Network_ID;
聽聽strcpy(ClientInfo.users_name[i], m_ClientInfo[i].User_Name);
聽聽strcpy(ClientInfo.clients_ipaddr[i], inet_ntoa(m_ClientInfo[i].Client_Addr.sin_addr));
聽}
聽for(i=0; i<=m_Connectnum; i++)
聽{
聽聽send(m_ClientInfo[i].Client_Socket, (char*)&ClientInfo, sizeof(cmd_client_info), NULL);
聽}
聽closesocket(pSocket);
聽聽聽聽聽聽聽 pList->DeleteItem(exitnum);
聽
聽return TRUE;
}
BOOL CServerDlg::OnReceive(SOCKET pSocket)
{
聽聽聽 static char rcvbuf[65535];聽聽 file://鎺?/font>鏀剁紦鍐插尯
聽聽聽 int ret;
聽int offset=0;
聽find_type* pFindType;
聽int i = 0;
聽CTime m_current_time=CTime::GetCurrentTime ();
聽CString strTime = m_current_time.Format("%c");
聽CString networkid; file://鍒?/font>琛ㄦ鐨勭綉緇淚D欏?/p>
聽聽聽 ret = recv(pSocket, rcvbuf, 65535, 0);
聽if(ret == OPERATION_ERROR)
聽聽return FALSE;
聽while(offset < ret)
聽{
聽聽pFindType = (find_type*)(rcvbuf+offset);
聽聽switch(pFindType->cmd_type)
聽聽{
聽聽case CMD_HELLO:聽
聽聽聽cmd_hello Hello;
聽聽聽memcpy(&Hello, rcvbuf+offset, sizeof(cmd_hello));
聽聽聽offset+=sizeof(cmd_hello);
聽聽聽cmd_hello_resp HelloResp;
聽聽聽m_NetworkID ++;
聽聽聽HelloResp.cmd_type = CMD_HELLO_RESP;
聽聽聽HelloResp.Network_ID = m_NetworkID;
聽聽聽strcpy(HelloResp.user_name, Hello.user_name);
聽聽聽memcpy((struct sockaddr*)&(m_ClientInfo[m_Connectnum].Client_Addr),
聽聽聽聽(const struct sockaddr*)&clientaddr, sizeof(sockaddr));
聽聽聽m_ClientInfo[m_Connectnum].Client_Socket = Accept;
聽聽聽strcpy(m_ClientInfo[m_Connectnum].User_Name, HelloResp.user_name);
聽聽聽m_ClientInfo[m_Connectnum].Network_ID = m_NetworkID;
聽聽聽m_ClientInfo[m_Connectnum].Login_Time = m_current_time;
聽聽聽send(pSocket, (char*)&HelloResp, sizeof(cmd_hello_resp), NULL);
聽聽聽file://鍚?/font>鐧誨綍鐨勫鎴風鍙戦佸洖搴旀姤鏂?br />聽聽聽Sleep(200);
聽聽聽cmd_client_info ClientInfo;
聽聽聽ClientInfo.cmd_type = CMD_CLIENT_INFO;
聽聽聽ClientInfo.client_num = m_Connectnum +1;
聽聽聽for(i=0; i<=m_Connectnum; i++)
聽聽聽{
聽聽聽聽ClientInfo.Networks_ID[i] = m_ClientInfo[i].Network_ID;
聽聽聽聽strcpy(ClientInfo.users_name[i], m_ClientInfo[i].User_Name);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 strcpy(ClientInfo.clients_ipaddr[i],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 inet_ntoa(m_ClientInfo[i].Client_Addr.sin_addr));
聽聽聽}
聽聽聽file://鍚?/font>鎵鏈夊湪綰垮鎴風鍙戦佸湪綰垮鎴蜂俊鎭姤鏂?br />聽聽聽for(i=0; i<=m_Connectnum; i++)
聽聽聽{
聽聽聽聽send(m_ClientInfo[i].Client_Socket, (char*)&ClientInfo,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 sizeof(cmd_client_info), NULL);
聽聽聽}
聽聽聽file://鍒?/font>鏂板鎴風淇℃伅鍒楄〃
聽聽聽networkid.Format("%d", m_NetworkID);
聽聽聽LVITEM lvinsert;
聽聽聽lvinsert.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
聽聽聽lvinsert.iItem=m_Connectnum;
聽聽聽lvinsert.iSubItem=0;
聽聽聽lvinsert.cchTextMax=20;
聽聽聽lvinsert.pszText=HelloResp.user_name;
聽聽聽lvinsert.iImage = 0;
聽聽聽pList->InsertItem (&lvinsert);
聽聽聽pList->SetItemText (m_Connectnum,1,networkid);
聽聽聽pList->SetItemText(m_Connectnum,2,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 inet_ntoa(m_ClientInfo[m_Connectnum].Client_Addr.sin_addr));
聽聽聽pList->SetItemText (m_Connectnum,3,strTime);
聽聽聽m_Connectnum ++;
聽聽聽break;
聽聽case CMD_ASK:
聽聽聽cmd_ask Ask;
聽聽聽cmd_ask_resp AskResp;
聽聽聽memcpy(&Ask,rcvbuf+offset,sizeof(cmd_ask));
聽聽聽offset+=sizeof(cmd_ask);
聽聽聽AskResp.cmd_type = CMD_ASK_RESP;
聽聽聽AskResp.Network_ID = Ask.Network_ID;
聽聽聽for(i=0; i<m_Connectnum; i++)
聽聽聽{
聽聽聽聽if(m_ClientInfo[i].Network_ID == Ask.Network_ID)
聽聽聽聽{
聽聽聽聽聽strcpy(AskResp.pData1,m_ClientInfo[i].User_Name);
聽聽聽聽聽strcat(AskResp.pData1, ":");
聽聽聽聽}
聽聽聽}
聽聽聽strcpy(AskResp.pData2, Ask.pData);
聽聽聽for(i=0; i<m_Connectnum; i++)
聽聽聽{
聽聽聽聽send(m_ClientInfo[i].Client_Socket, (char*)&AskResp, sizeof(AskResp), 0);
聽聽聽}
聽聽聽break;
聽聽case CMD_GOODBYE:
聽聽聽closesocket(pSocket);
聽聽聽break;
聽聽default:
聽聽聽break;
聽聽}
聽}
聽return TRUE;
}
BOOL CServerDlg::OnSend(SOCKET pSocket)
{
聽return TRUE;
}
void CServerDlg::OnOK()
{
聽closesocket(m_ListenSocket);
聽WSACleanup();
聽CDialog::OnOK();
}
void CServerDlg::OnTimer(UINT nIDEvent)
{
聽CTime m_current_time = CTime::GetCurrentTime();
聽CTimeSpan logintimes;
聽CString login_times;
聽CString networkid; file://鍒?/font>琛ㄦ鐨勭綉緇淚D欏?br />聽
聽for(int i=0; i<m_Connectnum; i++)
聽{
聽聽logintimes = m_current_time - m_ClientInfo[i].Login_Time;
聽聽login_times.Format("%d灝忔椂%d鍒?d縐?, logintimes.GetHours(),
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 logintimes.GetMinutes(),
聽聽聽聽聽聽聽聽聽聽聽 logintimes.GetSeconds());
聽
聽聽pList->SetItemText (i,4,login_times);
聽}
聽CDialog::OnTimer(nIDEvent);
}
// serverDlg.h : header file
//
#if !defined(AFX_SERVERDLG_H__B0AA0367_C1F4_11D4_AB1C_0080C8D6FEA5__INCLUDED_)
#define AFX_SERVERDLG_H__B0AA0367_C1F4_11D4_AB1C_0080C8D6FEA5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "global.h"
/////////////////////////////////////////////////////////////////////////////
// CServerDlg dialog
class CServerDlg : public CDialog
{
file://鍏?/font>灞鍑芥暟
聽聽聽 friend UINT KernelWorkThread(LPVOID pParam);
// Construction
public:
聽CListCtrl* pList; file://瀹?/font>鎴風鍦ㄧ嚎淇℃伅鍒楄〃妗嗗璞?br />聽CImageList m_imagelist;
聽SOCKET m_ListenSocket; file://鐢?/font>浜庣洃鍚鍙g殑濂楁帴瀛?br />聽client_info m_ClientInfo[MAX_CLIENT_NUM]; file://淇?/font>瀛樺湪綰垮鎴風淇℃伅鐨勭粨鏋勪綋鏁扮粍
聽sockaddr_in clientaddr; file://淇?/font>瀛樺彂璧瘋繛鎺ョ殑瀹㈡埛绔湴鍧
聽int m_Connectnum; file://鍦?/font>綰垮鎴風涓暟
聽int m_NetworkID;聽 file://榪?/font>鍥炵粰瀹㈡埛绔殑緗戠粶ID鍙?/p>
聽BOOL OnSend(SOCKET pSocket);聽聽聽 file://鍙?/font>閫佹暟鎹綉緇滀簨浠剁殑鍝嶅簲鍑芥暟
聽BOOL OnReceive(SOCKET pSocket); file://鎺?/font>鏀舵暟鎹綉緇滀簨浠剁殑鍝嶅簲鍑芥暟聽
聽BOOL OnClose(SOCKET pSocket);聽聽 file://鍏?/font>闂鎺ュ瓧緗戠粶浜嬩歡鐨勫搷搴斿嚱鏁?/p>
聽CServerDlg(CWnd* pParent = NULL);聽// standard constructor
// Dialog Data
聽file://{{AFX_DATA(CServerDlg)
聽enum { IDD = IDD_SERVER_DIALOG };
聽聽// NOTE: the ClassWizard will add data members here
聽file://}}AFX_DATA
聽// ClassWizard generated virtual function overrides
聽file://{{AFX_VIRTUAL(CServerDlg)
聽protected:
聽virtual void DoDataExchange(CDataExchange* pDX);聽// DDX/DDV support
聽file://}}AFX_VIRTUAL
// Implementation
protected:
聽HICON m_hIcon;
聽// Generated message map functions
聽file://{{AFX_MSG(CServerDlg)
聽virtual BOOL OnInitDialog();
聽afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
聽afx_msg void OnPaint();
聽afx_msg HCURSOR OnQueryDragIcon();
聽virtual void OnOK();
聽afx_msg void OnTimer(UINT nIDEvent);
聽file://}}AFX_MSG
聽DECLARE_MESSAGE_MAP()
};
1 浠涔堟槸鍥炶皟
杞歡妯″潡涔嬮棿鎬繪槸瀛樺湪鐫涓瀹氱殑鎺ュ彛錛屼粠璋冪敤鏂瑰紡涓婏紝鍙互鎶婁粬浠垎涓轟笁綾伙細鍚屾璋冪敤銆佸洖璋冨拰寮傛璋冪敤銆傚悓姝ヨ皟鐢ㄦ槸涓縐嶉樆濉炲紡璋冪敤錛岃皟鐢ㄦ柟瑕佺瓑寰呭鏂規墽琛屽畬姣曟墠榪斿洖錛屽畠鏄竴縐嶅崟鍚戣皟鐢紱鍥炶皟鏄竴縐嶅弻鍚戣皟鐢ㄦā寮忥紝涔熷氨鏄錛岃璋冪敤鏂瑰湪鎺ュ彛琚皟鐢ㄦ椂涔熶細璋冪敤瀵規柟鐨勬帴鍙o紱寮傛璋冪敤鏄竴縐嶇被浼兼秷鎭垨浜嬩歡鐨勬満鍒訛紝涓嶈繃瀹冪殑璋冪敤鏂瑰悜鍒氬ソ鐩稿弽錛屾帴鍙g殑鏈嶅姟鍦ㄦ敹鍒版煇縐嶈鎭垨鍙戠敓鏌愮浜嬩歡鏃訛紝浼氫富鍔ㄩ氱煡瀹㈡埛鏂癸紙鍗寵皟鐢ㄥ鎴鋒柟鐨勬帴鍙o級銆傚洖璋冨拰寮傛璋冪敤鐨勫叧緋婚潪甯哥揣瀵嗭紝閫氬父鎴戜滑浣跨敤鍥炶皟鏉ュ疄鐜板紓姝ユ秷鎭殑娉ㄥ唽錛岄氳繃寮傛璋冪敤鏉ュ疄鐜版秷鎭殑閫氱煡銆傚悓姝ヨ皟鐢ㄦ槸涓夎呭綋涓渶綆鍗曠殑錛岃屽洖璋冨張甯稿父鏄紓姝ヨ皟鐢ㄧ殑鍩虹錛屽洜姝わ紝涓嬮潰鎴戜滑鐫閲嶈璁哄洖璋冩満鍒跺湪涓嶅悓杞歡鏋舵瀯涓殑瀹炵幇銆?
瀵逛簬涓嶅悓綾誨瀷鐨勮璦錛堝緇撴瀯鍖栬璦鍜屽璞¤璦錛夈佸鉤鍙幫紙Win32銆丣DK錛夋垨鏋勬灦錛圕ORBA銆丏COM銆乄ebService錛夛紝瀹㈡埛鍜屾湇鍔$殑浜や簰闄や簡鍚屾鏂瑰紡浠ュ錛岄兘闇瑕佸叿澶囦竴瀹氱殑寮傛閫氱煡鏈哄埗錛岃鏈嶅姟鏂癸紙鎴栨帴鍙f彁渚涙柟錛夊湪鏌愪簺鎯呭喌涓嬭兘澶熶富鍔ㄩ氱煡瀹㈡埛錛岃屽洖璋冩槸瀹炵幇寮傛鐨勪竴涓渶綆鎹風殑閫斿緞銆?
瀵逛簬涓鑸殑緇撴瀯鍖栬璦錛屽彲浠ラ氳繃鍥炶皟鍑芥暟鏉ュ疄鐜板洖璋冦傚洖璋冨嚱鏁頒篃鏄竴涓嚱鏁版垨榪囩▼錛屼笉榪囧畠鏄竴涓敱璋冪敤鏂硅嚜宸卞疄鐜幫紝渚涜璋冪敤鏂逛嬌鐢ㄧ殑鐗規畩鍑芥暟銆?
鍦ㄩ潰鍚戝璞$殑璇█涓紝鍥炶皟鍒欐槸閫氳繃鎺ュ彛鎴栨娊璞$被鏉ュ疄鐜扮殑錛屾垜浠妸瀹炵幇榪欑鎺ュ彛鐨勭被鎴愪負鍥炶皟綾伙紝鍥炶皟綾葷殑瀵硅薄鎴愪負鍥炶皟瀵硅薄銆傚浜庤薄C++鎴朞bject Pascal榪欎簺鍏煎浜嗚繃紼嬬壒鎬х殑瀵硅薄璇█錛屼笉浠呮彁渚涗簡鍥炶皟瀵硅薄銆佸洖璋冩柟娉曠瓑鐗規э紝涔熻兘鍏煎榪囩▼璇█鐨勫洖璋冨嚱鏁版満鍒躲?
Windows騫沖彴鐨勬秷鎭満鍒朵篃鍙互鐪嬩綔鏄洖璋冪殑涓縐嶅簲鐢紝鎴戜滑閫氳繃緋葷粺鎻愪緵鐨勬帴鍙f敞鍐屾秷鎭鐞嗗嚱鏁幫紙鍗沖洖璋冨嚱鏁幫級錛屼粠鑰屽疄鐜版帴鏀躲佸鐞嗘秷鎭殑鐩殑銆傜敱浜嶹indows騫沖彴鐨凙PI鏄敤C璇█鏉ユ瀯寤虹殑錛屾垜浠彲浠ヨ涓哄畠涔熸槸鍥炶皟鍑芥暟鐨勪竴涓壒渚嬨?
瀵逛簬鍒嗗竷寮忕粍浠朵唬鐞嗕綋緋籆ORBA錛屽紓姝ュ鐞嗘湁澶氱鏂瑰紡錛屽鍥炶皟銆佷簨浠舵湇鍔°侀氱煡鏈嶅姟絳夈備簨浠舵湇鍔″拰閫氱煡鏈嶅姟鏄疌ORBA鐢ㄦ潵澶勭悊寮傛娑堟伅鐨勬爣鍑嗘湇鍔★紝浠栦滑涓昏璐熻矗娑堟伅鐨勫鐞嗐佹淳鍙戙佺淮鎶ょ瓑宸ヤ綔銆傚涓浜涚畝鍗曠殑寮傛澶勭悊榪囩▼錛屾垜浠彲浠ラ氳繃鍥炶皟鏈哄埗鏉ュ疄鐜般?
涓嬮潰鎴戜滑闆嗕腑姣旇緝鍏鋒湁浠h〃鎬х殑璇█錛圕銆丱bject Pascal錛夊拰鏋舵瀯錛圕ORBA錛夋潵鍒嗘瀽鍥炶皟鐨勫疄鐜版柟寮忋佸叿浣撲綔鐢ㄧ瓑銆?
2.1 鍑芥暟鎸囬拡
鍥炶皟鍦–璇█涓槸閫氳繃鍑芥暟鎸囬拡鏉ュ疄鐜扮殑,閫氳繃灝嗗洖璋冨嚱鏁扮殑鍦板潃浼犵粰琚皟鍑芥暟浠庤屽疄鐜板洖璋冦傚洜姝わ紝瑕佸疄鐜板洖璋冿紝蹇呴』棣栧厛瀹氫箟鍑芥暟鎸囬拡錛岃鐪嬩笅闈㈢殑渚嬪瓙錛?
|
鍙互鐪嬪嚭錛屽嚱鏁扮殑瀹氫箟鍜屽嚱鏁版寚閽堢殑瀹氫箟闈炲父綾諱技銆?
涓鑸殑鍖栵紝涓轟簡綆鍖栧嚱鏁版寚閽堢被鍨嬬殑鍙橀噺瀹氫箟錛屾彁楂樼▼搴忕殑鍙鎬э紝鎴戜滑闇瑕佹妸鍑芥暟鎸囬拡綾誨瀷鑷畾涔変竴涓嬨?
|
鍥炶皟鍑芥暟鍙互璞℃櫘閫氬嚱鏁頒竴鏍瘋紼嬪簭璋冪敤錛屼絾鏄彧鏈夊畠琚綋浣滃弬鏁頒紶閫掔粰琚皟鍑芥暟鏃舵墠鑳界О浣滃洖璋冨嚱鏁般?
琚皟鍑芥暟鐨勪緥瀛愶細
|
濡傛灉璧嬩簡涓嶅悓鐨勫肩粰璇ュ弬鏁幫紝閭d箞璋冪敤鑰呭皢璋冪敤涓嶅悓鍦板潃鐨勫嚱鏁般傝祴鍊煎彲浠ュ彂鐢熷湪榪愯鏃訛紝榪欐牱浣夸綘鑳藉疄鐜板姩鎬佺粦瀹氥?
2.2 鍙傛暟浼犻掕鍒?/SPAN>
鍒扮洰鍓嶄負姝紝鎴戜滑鍙璁轟簡鍑芥暟鎸囬拡鍙婂洖璋冭屾病鏈夊幓娉ㄦ剰ANSI C/C++鐨勭紪璇戝櫒瑙勮寖銆傝澶氱紪璇戝櫒鏈夊嚑縐嶈皟鐢ㄨ鑼冦傚鍦╒isual C++涓紝鍙互鍦ㄥ嚱鏁扮被鍨嬪墠鍔燺cdecl錛宊stdcall鎴栬卂pascal鏉ヨ〃紺哄叾璋冪敤瑙勮寖錛堥粯璁や負_cdecl錛夈侰++ Builder涔熸敮鎸乢fastcall璋冪敤瑙勮寖銆傝皟鐢ㄨ鑼冨獎鍝嶇紪璇戝櫒浜х敓鐨勭粰瀹氬嚱鏁板悕錛屽弬鏁頒紶閫掔殑欏哄簭錛堜粠鍙沖埌宸︽垨浠庡乏鍒板彸錛夛紝鍫嗘爤娓呯悊璐d換錛堣皟鐢ㄨ呮垨鑰呰璋冪敤鑰咃級浠ュ強鍙傛暟浼犻掓満鍒訛紙鍫嗘爤錛孋PU瀵勫瓨鍣ㄧ瓑錛夈?
灝嗚皟鐢ㄨ鑼冪湅鎴愭槸鍑芥暟綾誨瀷鐨勪竴閮ㄥ垎鏄緢閲嶈鐨勶紱涓嶈兘鐢ㄤ笉鍏煎鐨勮皟鐢ㄨ鑼冨皢鍦板潃璧嬪肩粰鍑芥暟鎸囬拡銆備緥濡傦細
|
鎸囬拡p鍜宑allee()鐨勭被鍨嬩笉鍏煎錛屽洜涓哄畠浠湁涓嶅悓鐨勮皟鐢ㄨ鑼冦傚洜姝や笉鑳藉皢琚皟鐢ㄨ呯殑鍦板潃璧嬪肩粰鎸囬拡p錛屽敖綆′袱鑰呮湁鐩稿悓鐨勮繑鍥炲煎拰鍙傛暟鍒?
2.3 搴旂敤涓句緥
C璇█鐨勬爣鍑嗗簱鍑芥暟涓緢澶氬湴鏂瑰氨閲囩敤浜嗗洖璋冨嚱鏁版潵璁╃敤鎴峰畾鍒跺鐞嗚繃紼嬨傚甯哥敤鐨勫揩閫熸帓搴忓嚱鏁般佷簩鍒嗘悳绱㈠嚱鏁扮瓑銆?
蹇熸帓搴忓嚱鏁板師鍨嬶細
|
鍏朵腑fcmp灝辨槸涓涓洖璋冨嚱鏁扮殑鍙橀噺銆?
涓嬮潰緇欏嚭涓涓叿浣撶殑渚嬪瓙錛?
|
2.4 闈㈠悜瀵硅薄璇█涓殑鍥炶皟錛圖elphi錛?
Dephi涓嶤++涓鏍鳳紝涓轟簡淇濇寔涓庤繃紼嬭璦Pascal鐨勫吋瀹規э紝瀹冨湪寮曞叆闈㈠悜瀵硅薄鏈哄埗鐨勫悓鏃訛紝淇濈暀浜嗕互鍓嶇殑緇撴瀯鍖栫壒鎬с傚洜姝わ紝瀵瑰洖璋冪殑瀹炵幇錛屼篃鏈変袱縐嶆埅鐒朵笉鍚岀殑妯″紡錛屼竴縐嶆槸緇撴瀯鍖栫殑鍑芥暟鍥炶皟妯″紡錛屼竴縐嶆槸闈㈠悜瀵硅薄鐨勬帴鍙fā寮忋?
2.4.1 鍥炶皟鍑芥暟
鍥炶皟鍑芥暟綾誨瀷瀹氫箟錛?
|
鎸夌収鍥炶皟鍑芥暟鐨勬牸寮忚嚜瀹氫箟鍑芥暟鐨勫疄鐜幫紝濡?/P>
|
鍥炶皟鐨勪嬌鐢?/P>
|
涓嬮潰錛屾垜浠氨鍙互鍦ㄦ垜浠殑紼嬪簭閲屾寜鐓ч渶瑕佽皟鐢ㄨ繖涓や釜鍑芥暟浜?/P>
|
2.4.2 鍥炶皟瀵硅薄
浠涔堝彨鍥炶皟瀵硅薄鍛紝瀹冨叿浣撶敤鍦ㄥ摢浜涘満鍚堬紵棣栧厛錛岃鎴戜滑鎶婂畠涓庡洖璋冨嚱鏁板姣斾竴涓嬶紝鍥炶皟鍑芥暟鏄竴涓畾涔変簡鍑芥暟鐨勫師鍨嬶紝鍑芥暟浣撳垯浜ょ敱絎笁鏂規潵瀹炵幇鐨勪竴縐嶅姩鎬佸簲鐢ㄦā寮忋傝瀹炵幇涓涓洖璋冨嚱鏁幫紝鎴戜滑蹇呴』鏄庣‘鐭ラ亾鍑犵偣錛氳鍑芥暟闇瑕侀偅浜涘弬鏁幫紝榪斿洖浠涔堢被鍨嬬殑鍊箋傚悓鏍鳳紝涓涓洖璋冨璞′篃鏄竴涓畾涔変簡瀵硅薄鎺ュ彛錛屼絾鏄病鏈夊叿浣撳疄鐜扮殑鎶借薄綾伙紙鍗蟲帴鍙o級銆傝瀹炵幇涓涓洖璋冨璞★紝鎴戜滑蹇呴』鐭ラ亾錛氬畠闇瑕佸疄鐜板摢浜涙柟娉曪紝姣忎釜鏂規硶涓湁鍝簺鍙傛暟錛岃鏂規硶闇瑕佹斁鍥炰粈涔堝箋?
鍥犳錛屽湪鍥炶皟瀵硅薄榪欑搴旂敤妯″紡涓紝鎴戜滑浼氱敤鍒版帴鍙c傛帴鍙e彲浠ョ悊瑙f垚涓涓畾涔夊ソ浜嗕絾鏄病鏈夊疄鐜扮殑綾伙紝瀹冨彧鑳介氳繃緇ф壙鐨勬柟寮忚鍒殑綾誨疄鐜般侱elphi涓殑鎺ュ彛鍜孋OM鎺ュ彛綾諱技錛屾墍鏈夌殑鎺ュ彛閮界戶鎵夸笌IInterface錛堢瓑鍚屼簬IUnknow錛夛紝騫朵笖瑕佸疄鐜頒笁涓熀鏈殑鏂規硶QueryInterface, _AddRef, 鍜宊Release銆?
|
|
|
濡傛灉浼犲叆鐨勫璞′負TRect錛岄偅涔堢敾鐭╁艦錛涘鏋滀負TRound錛岄偅涔堝氨涓哄渾褰€傜敤鎴蜂篃鍙互鎸夌収鑷繁鐨勬剰鍥炬潵瀹炵幇IShape鎺ュ彛錛岀敾鍑鴻嚜宸辯殑鍥懼艦錛?
|
2.4.3 鍥炶皟鏂規硶
鍥炶皟鏂規硶(Callback Method)鍙互鐪嬩綔鏄洖璋冨璞$殑涓閮ㄥ垎錛孌elphi瀵箇indows娑堟伅鐨勫皝瑁呭氨閲囩敤浜嗗洖璋冩柟娉曡繖涓蹇點傚湪鏈変簺鍦哄悎錛屾垜浠笉闇瑕佹寜鐓х粰瀹氱殑瑕佹眰瀹炵幇鏁翠釜瀵硅薄錛岃屽彧瑕佸疄鐜板叾涓殑涓涓柟娉曞氨鍙互浜嗭紝榪欐槸鎴戜滑灝變細鐢ㄥ埌鍥炶皟鏂規硶銆?
鍥炶皟鏂規硶鐨勫畾涔夊涓嬶細
|
TNotifyEvent 鏄疍elphi涓渶甯哥敤鐨勫洖璋冩柟娉曪紝紿椾綋銆佹帶浠剁殑寰堝浜嬩歡錛屽鍗曞嚮浜嬩歡銆佸叧闂簨浠剁瓑閮芥槸閲囩敤浜員notifyEvent銆傚洖璋冩柟娉曠殑鍙橀噺涓鑸氳繃浜嬩歡灞炴х殑鏂瑰紡鏉ュ畾涔夛紝濡俆CustomForm鐨勫垱寤轟簨浠剁殑瀹氫箟錛?
|
鎴戜滑閫氳繃緇欎簨浠跺睘鎬у彉閲忚祴鍊煎氨鍙互瀹氬埗浜嬩歡澶勭悊鍣ㄣ?/P>
鐢ㄦ埛瀹氫箟瀵硅薄錛堝寘鍚洖璋冩柟娉曠殑瀵硅薄錛夛細
|
紿椾綋瀵硅薄錛?/P>
|
浣跨敤鏂規硶錛?/P>
|
3 鍥炶皟鍦ㄥ垎甯冨紡璁$畻涓殑搴旂敤錛圕ORBA錛?/SPAN>
3.1 鍥炶皟鎺ュ彛妯″瀷
CORBA鐨勬秷鎭紶閫掓満鍒舵湁寰堝縐嶏紝姣斿鍥炶皟鎺ュ彛銆佷簨浠舵湇鍔″拰閫氱煡鏈嶅姟絳夈傚洖璋冩帴鍙g殑鍘熺悊寰堢畝鍗曪紝CORBA瀹㈡埛鍜屾湇鍔″櫒閮藉叿鏈夊弻閲嶈鑹詫紝鍗沖厖褰撴湇鍔″櫒涔熸槸瀹㈡埛瀹㈡埛銆?
鍥炶皟鎺ュ彛鐨勫弽鍚戣皟鐢ㄤ笌姝e悜璋冪敤寰寰鏄悓鏃惰繘琛岀殑錛屽鏋滄湇鍔$澶氭璋冪敤璇ュ洖璋冩帴鍙o紝閭d箞榪欎釜鍥炶皟鎺ュ彛灝卞彉鎴愬紓姝ユ帴鍙d簡銆傚洜姝わ紝鍥炶皟鎺ュ彛鍦–ORBA涓父甯稿厖褰撲簨浠舵敞鍐岀殑鐢ㄩ旓紝瀹㈡埛绔皟鐢ㄨ娉ㄥ唽鍑芥暟鏃訛紝瀹㈡埛鍑芥暟灝辨槸鍥炶皟鍑芥暟錛屽湪姝ゅ悗鐨勮皟鐢ㄤ腑錛岀敱浜庝笉闇瑕佸鎴風鐨勪富鍔ㄥ弬涓庯紝璇ュ嚱鏁板氨鏄疄鐜頒簡涓縐嶅紓姝ユ満鍒躲?
浠嶤ORBA瑙勮寖鎴戜滑鐭ラ亾錛屼竴涓狢ORBA鎺ュ彛鍦ㄦ湇鍔$鍜屽鎴風鏈変笉鍚岀殑琛ㄧ幇褰㈠紡錛屽湪瀹㈡埛绔竴鑸嬌鐢ㄦ々錛圫tub錛夋枃浠訛紝鏈嶅姟绔垯鐢ㄥ埌妗嗘灦錛圫keleton錛夋枃浠訛紝鎺ュ彛鐨勮鏍奸噰鐢↖DL鏉ュ畾涔夈傝屽洖璋冨嚱鏁扮殑寮曞叆錛屼嬌寰楁湇鍔$鍜屽鎴風閮介渶瑕佸疄鐜頒竴瀹氱殑妗╁拰妗嗘灦銆備笅闈㈡槸鍥炶皟鎺ュ彛鐨勫疄鐜版ā鍨嬶細
涓嬮潰緇欏嚭浜嗕竴涓嬌鐢ㄥ洖璋冪殑鎺ュ彛鏂囦歡錛屾湇鍔$闇瑕佸疄鐜癝erver鎺ュ彛鐨勬鏋訛紝瀹㈡埛绔渶瑕佸疄鐜癈allBack鐨勬鏋訛細
|
瀹㈡埛绔鍏堥氳繃鍚屾鏂瑰紡璋冪敤鏈嶅姟绔殑鎺ュ彛RegistCB錛岀敤鏉ユ敞鍐屽洖璋冩帴鍙allBack銆傛湇鍔$鏀跺埌璇ヨ姹備互鍚庯紝灝變細淇濈暀璇ユ帴鍙e紩鐢紝濡傛灉鍙戠敓鏌愮浜嬩歡闇瑕佸悜瀹㈡埛绔氱煡鐨勬椂鍊欏氨閫氳繃璇ュ紩鐢ㄨ皟鐢ㄥ鎴鋒柟鐨凮nEvent鍑芥暟錛屼互渚垮鏂瑰強鏃跺鐞嗐?nbsp;
from gushizuozhe
load data infile "zuozhe.txt" into table gushizuozhe fields optionally enclosed by '\"' terminated by
',' (ID,name,zi,hao);
grant select on *.* to "public@192.168.%" identified by 'public';
revoke select on *.* from "public@192.168.%"
revoke 騫朵笉鑳藉垹闄ょ敤鎴鳳紝delete from mysql.user where user like "public%"
flush flush_option[,flush_option]
kill thread_id unix/linux涓嬭繘琛?BR>show processlist
select user()
set password for www@localhost=password("www")
set option_setting
鍐欓攣銆佽閿?BR>lock tables gushi write,gushizuozhe write;
unlock tables
MYSQL緙栫▼鎺ュ彛
MYSQL C API
1銆佹暟鎹被鍨?BR>1)my_ulonglong
2)my_bool
3)MYSQL_FIELD_OFFSET
4)MYSQL
5)MYSQL_RES
6)MYSQL_ROW
7)MYSQL_FIELD
{
char *name;
char *table;
char *def;
enum enum_field_types type;//鍒楃殑鏁版嵁綾誨瀷
unsigned int length;//鍒楀畾涔夌殑闀垮害
unsigned int max_length;//鏁版嵁瀹為檯鐨勬渶澶ч暱搴?BR>unsigned int flags;//鍒楃殑灞炴?BR>}
8)unsigned int decimals//灝忔暟浣嶆暟
2銆佸嚱鏁?BR>1)my_bool mysql_change_user(MYSQL *mysql,const char *user,const char *password,const char *db)
2)void mysql_close(MYSQL *mysql)
3)MYSQL *mysql_init(MYSQL *mysql)
4)int mysql_option(MYSQL *mysql,enum mysql_option,const char *arg)鎸囧畾鏇寸簿紜殑榪炴帴鍙傛暟閫夐」
5)int mysql_ping(MYSQL *mysql)//媯鏌ヨ繛鎺ユ槸鍚︽甯?BR>6)MYSQL *mysql_real_connect(MYSQL *mysql,const char *host,const char *user,const char *password,const
char *db,unsiged int port,const char *unix_socket,unsigned int client_flag)
7)int mysql_select_db(MYSQL *mysql,const char *db)//閫夋嫨鏁版嵁搴揹b涓哄綋鍓嶆暟鎹簱
8)int mysql_query(MYSQL *mysql,const char *query)
9)int mysql_real_query(MYSQL *mysql,const char *query,unsigned int length)
10)char *mysql_info(MYSQL *mysql)//榪斿洖鏈鍚庢墽琛岀殑涓嬈℃搷浣滅殑鏈夊叧淇℃伅銆?BR>11)MYSQL_RES *mysql_store_result(MYSQL *mysql)//璇誨彇涓涓煡璇㈢殑鍏ㄩ儴緇撴灉銆?BR>12)MYSQL_RES *mysql_use_result(MYSQL *mysql)//鍒濆鍖栦竴涓粨鏋滈泦錛屼絾鏄笉鎶婄粨鏋滆鍒板鎴風錛屼粛鐒朵繚鐣欏湪鏈嶅姟鍣?/P>
涓?BR>13)void mysql_free_result(MYSQL_RES *result)//閲婃斁緇撴灉闆嗕嬌鐢ㄧ殑鍐呭瓨銆?BR>14)my_ulonglong mysql_affected_rows(MYSQL *mysql)//榪斿洖鏈鍚庝竴涓猽pdate,delete,insert鎿嶄綔褰卞搷鐨勮褰曟暟銆?BR>15)my_ulonglong mysql_num_rows(MYSQL *mysql)//mysql_store_result()榪斿洖鐨勭粨鏋滈泦涓殑璁板綍鏁般?BR>16)MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,MYSQL_ROW_OFFSET offset)
17)MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)//褰撳墠鍏夋爣浣嶇疆
18)MYSQL_ROW_OFFSET mysql_data_seek(MYSQL_RES *result,unsigned long long offset)
19)MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)//緇撴灉闆嗕腑鐨勪笅涓鏉¤褰?BR>20)unsigned int mysql_fetch_lengths(MYSQL_RES *result)//緇撴灉闆嗕腑褰撳墠璁板綍鐨勯暱搴?BR>21)unsigned int mysql_num_fields(MYSQL_RES *result)//緇撴灉闆嗕腑鍒楃殑鏁扮洰
22)MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,MYSQL_FIELD_OFFSET offset)
23)MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)//褰撳墠鍏夋爣浣嶇疆
24)MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)//緇撴灉闆嗕腑褰撳墠鍒椾俊鎭?BR>25)MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)//緇撴灉闆嗕腑鎵鏈夊垪淇℃伅
26)MYSQL_RES *mysql_list_dbs(MYSQL *mysql,const char *wild)//涓巜ild姝e垯琛ㄨ揪寮忓尮閰嶇殑鏁版嵁搴撲俊鎭?BR>27)MYSQL_RES *mysql_list_tables(MYSQL *mysql,const char *wild)//涓巜ild姝e垯琛ㄨ揪寮忓尮閰嶇殑琛ㄤ俊鎭?BR>28)MYSQL_RES *mysql_list_fields(MYSQL *mysql,const char * table,const char *wild)//涓庡綋鍓嶈〃錛屽尮閰峸ild姝?/P>
鍒欒〃杈懼紡鐨勬墍鏈夊垪鍚嶇殑緇撴灉闆?BR>29)MYSQL_RES *mysql_list_processes(MYSQL *mysql)
30)char *mysql_stat(MYSQL *mysql)//褰撳墠鏈嶅姟鍣ㄧ殑淇℃伅
31)char *mysql_get_server_info(MYSQL *mysql)
32)char *mysql_get_client_info(MYSQL *mysql)
33)char *mysql_get_host_info(MYSQL *mysql)
34)char *mysql_get_proto_info(MYSQL *mysql)
35)unsiged long mysql_thread_id(MYSQL *mysql)
36)int mysql_kill(MYSQL *mysql,unsiged long pid)
37)int mysql_shutdown(MYSQL *mysql)
38)void mysql_debug(char *debug)
39)int mysql_dump_debug_info(char *debug)
40)unsigned int mysql_errno(MYSQL *mysql)
41)char *mysql_error(MYSQL *mysql)
寰楀埌宸ュ叿鏍忓昂瀵?BR>CSize sizeBar;
CToolBar m_wndToolBar;
m_wndToolBar.GetToolBarCtrl().GetMaxSize(&sizeBar);
鍦ㄥ伐鍏鋒爮涓婃坊鍔犵紪杈戞
CRect rect;
m_wndToolBar.SetButtonInfo(9,ID_SEPARATOR,TBBS_SEPARATOR,100);
m_wndToolBar.GetItemRect(9,&rect);
m_wndComboBox.Create(CBS_DROPDOWN|WS_VISIBLE|WS_VSCROLL|CBS_AUTOHSCROLL,rect, &m_wndToolBar,105);
鏍煎紡鍖栦竴孌墊簮浠g爜
Alt+F8
瀹氫綅棰勫鐞?if錛?endif
Ctrl+K
欏跺眰紿楀彛鐨勫疄鐜?BR>鍦≒reCreateWindow()涓姞鍏?BR>cs.dwExStyle=WS_EX_TOPMOST