文章分类 - MFC
摘要:直接上代码:// CmfcdllApp 初始化BOOL CmfcdllApp::InitInstance(){ CWinApp::InitInstance(); AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxMessageBox(L"我是动态链接库入口点"); return TRUE;}BOOL CmfcdllApp::ExitInstance(){ CWinApp::ExitInstance(); AFX_MANAGE_STATE(AfxGetStaticModuleState());//如果是MFC dl...
阅读全文
摘要:先上代码,以后写注释// select服务端Dlg.cpp : 实现文件//#include "stdafx.h"#include "select服务端.h"#include "select服务端Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif#define WM_SOCKET WM_USER + 1struct CompletionPortAndMyHwnd {//目的是在工作线程中得到窗口指针 HANDLE CompletionPort; Cselect服务端Dlg* my_win;}c
阅读全文
摘要:_WSARecv_ 什么是重叠IO模型呢?说白了,就是我们向系统投递一个消息,然后系统就会反馈给我们一个结果,而这个结果用什么保存呢?那就是跟上一章我写的事件选择模型一样, 那么就是用事件的状态,守信 与 未受信,也就是说,步骤如下;1.创建socket,然后接受客户端我就不用说了吧,2.如果accept接受到一个客户端的请求的话,那么我们就把这个socket和一个IO重叠结构给关联起来,不要以为IO重叠结构有啥好神奇的,其实他就是一个事件的包装类而已,这个重叠结构里面有一个事件对象,那么, socket和这个IO重叠结构绑定在了一起后,然后我们就向系统发送一个消息,发送一个什么消息呢?WSA
阅读全文
摘要:WSAEventSelect事件选择模型,什么是事件选择模型呢?就是咱们把客户端的socket和一个事件绑定在一起后,然后调用waitmutipleobject,然后等待函数的返回,其实跟那个线程同步差不多,就是等待事件对象的状态改变,状态改变是什么意思呢?也就是受信和未受信,2种状态,如果有客户端发送消息,我们就受信了,然后我们就进行处理,处理完毕后,我们就应该把事件对象进行设置到未受信,然后继续等待事件对象的受信WSAEventSelect事件选择模型创建的步骤,1.新建2个数组,一个装socket,一个装事件,因为是一个事件句柄和一个socket绑定嘛,所以需要2个,还需要一个count
阅读全文
摘要:void C例子MAP和LISTDlg::OnBnClickedButton3(){ CMap map; TCHAR buff[1024];//作为进制转换的结果放在里面 for(int i=0;i<16;i++){ //用16进制作为map的key //整数到16进制,咱们就联想到_itot memset(buff,0,sizeof(TCHAR));//清空数组 _itot(i,buff,16);//转换成16进制 CString f = buff; map.SetAt(f,i); }...
阅读全文
摘要:void C例子MAP和LISTDlg::OnBnClickedButton2(){ //字符串,2进制到8进制,10进制,16进制 //先转到10进制,在通过10进制转到8进制 //2进制到8进制 //TCHAR buff[1024]={0}; //TCHAR* str =_T("1011010");//如果在unicode工程下面,不加_T的话,那么他就默认表示ansi编码,所以我们得去转换一下 //int a = _tcstol(str,NULL,2);//这个时候这个a就保存的2进制转换的10进制整数了,_tcstol 和 atoi 有啥区...
阅读全文
摘要:void C例子MAP和LISTDlg::OnBnClickedButton1(){CArray array;//CArray array; 区别在于后面的这个是引用传递,也就是自己把指针给add这个方法,而前面那个的话,会先在自己的函数内部划分一些空间来copy一个对象,然后在把对象传递给add方法,这样就拷贝了2份了,这样效率不高,所以说,推荐使用第二种for(int i=0;iSetDlgItemText(IDC_EDIT1,str);}
阅读全文
摘要:先来说下什么是异步WSAAsyncSelect模型,异步WSAAsyncSelect模型说白了,就是让系统帮咱们去监听咱们服务器上的一个socket系统会帮我们监听客户端的连接,客户端的断开,客户端的发送数据,等等,一般,这种模型适用与窗口模型,先来讲讲他如何使用:1.在创建完窗口的时候,顺便把socket也一起创建了吧,在把咱们的socket交给系统处理(让他我们监听咱们socket的消息,比如客户端连接,断开这些啊,就不用咱们人为的去判断了)2.重写消息函数,也就是窗口回调函数,里面判断message的消息是否是咱们自定义的消息,然后在判断处理,3.重写消息函数,拦截WM_DESTROY
阅读全文
摘要:int htons(INT) 将端口号转换成计算机能识别的端口号,在做socket的时候需要int inet_addr(String) 把字符串IP转换成计算机能够识别的整形,"127.0.0.1" 转换成字符串能够识别的整数string inet_ntoa(int) 把整形转到string类型.521515->"127.0.0.1"int atoi(String) 把字符串转换为整数,适用于ansi,不适用于unicode,如果是ansi字符串,则需要转换成unicode,所以推荐使用下面这个函数int _tstoi(String) 把字符串转换
阅读全文
摘要:今天发现了socket的一点:当A客户端连接到B服务器的时候,A成功连接并且发送给B服务器的时候,然后A客户端在关闭socket,而B服务器还是能收到客户端第一次发送的数据,这应该是脏数据了,是用的select模型做的,不知道是不是和select模型有关系,大家自己测试吧1.定义一个 fd_set fdread;//结构2.定一个,这个用来超时等待的设置 struct timeval tv = {0, 200};//超时时间 SELECT模型中用到的这里是200毫秒 ,第一个参数为秒,第二个为毫秒,任选一个3.重置,FD_ZERO(&fdread);//清空fd_set结构 如...
阅读全文
摘要://char a[]="我发送过去没艹?"; TCHAR a[]=_T("我发送过去没艹?");//如果是用的ansi平台的话,那么他的strlen(a) == 15.不包括\0,sizeof(a) == 16 //如果是用的unicode平台的话,那么他的strlen(a) == 8.不包括\0,sizeof(a) == 18.为什么是18呢?因为18表示他占的字节的长度,2*8个字符=16,别忘了还有个\0呢,他也是占2个字节 int aa = _tcslen(a);int size = sizeof(a);
阅读全文
摘要:全局热键的注册1.在初始化对话框的时候注册热键RegisterHotKey(this->m_hWnd,2,MOD_CONTROL | MOD_SHIFT,'Q');2.重写消息函数,OnHotKey if(nHotKeyId == 2){ AfxMessageBox(_T("您按下的是shift+ctrl+q")); }else if(nHotKeyId == 3){ AfxMessageBox(_T("您按下的是shift+win+q")); } CDialog::OnHotKey(nHotKeyId, nKey1, nKey2)
阅读全文
摘要:void C键盘消息Dlg::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if((nFlags | MK_CONTROL) == nFlags ){ AfxMessageBox(_T("我同时按下了contrl键")); } if((nFlags | MK_CONTROL | MK_SHIFT) == nFlags ){//进行或运算 010 | 010 = 010 AfxMessageBox(_T("我同时按下了contrl+shif...
阅读全文
摘要:void C定时器Dlg::OnBnClickedButton1(){ SetTimer(1,5000,NULL); SetTimer(2,5000,NULL);}void C定时器Dlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CString s; if(nIDEvent == 1){ s.Format(_T("我是1号\t%d"),GetCurrentThreadId); AfxMessageBox(s); }else if(nIDEvent == ...
阅读全文
摘要:void C编码转换Dlg::OnBnClickedButton1(){ char *buff="不abc111"; int len = sizeof(buff);//计算的是指针的长度,长度是4.算的是char指针类型 int len1 = strlen(buff);//不算\0,中文算2个字节 CString l; l.Format(_T("长度是%d"),len); AfxMessageBox(l);}void C编码转换Dlg::OnBnClickedButton2(){ char buff[]="你abc111"; int
阅读全文
摘要:LRESULT C多线程查找文件Dlg::OnAddItemMessage(WPARAM wParam, LPARAM lParam){//LRESULT == long CString* str = (CString*)wParam; myList.InsertItem(0,*str); delete str;return 0;}HANDLE semaphoreh;//查找文件线程UINT __cdecl MyThread( LPVOID pParam ){ CMyFile* file = (CMyFile*)pParam; CStrin...
阅读全文
摘要:HANDLE evetnHandle;UINT __cdecl ThreadProc5( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定 C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换 while(true){ CString str; DWORD ret = WaitForSingleObject(evetnHandle,0);//等待这个内核对象,一直等待,如果等到的话,他不会设置成非受信状态,因为我们刚刚设置过了 if(ret ==...
阅读全文
摘要:UINT __cdecl ThreadProc4( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定 C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换 while(true){ CString str; DWORD ret = WaitForSingleObject(semaphoreh,0);//获取信号量,超时为0 ,表示不等待, 如果调用成功的话,信号量会减1 if(ret == WAIT_ABANDONED || ret =...
阅读全文
摘要:HANDLE mutex;void C界面线程Dlg::OnCancel(){ // TODO: 在此添加专用代码和/或调用基类 DeleteCriticalSection(&lpCriticalSection); CloseHandle(mutex); CDialog::OnCancel();}UINT __cdecl ThreadProc3( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定 C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换 int...
阅读全文
摘要:int ccc;CRITICAL_SECTION lpCriticalSection;UINT __cdecl ThreadProc1( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定 C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换 int i=0; while(imyedit1+=str; LeaveCriticalSection(&lpCriticalSection);//解锁 ::SendMessage(t->GetSafeHwnd(), W...
阅读全文

浙公网安备 33010602011771号