第15课多线程与网络编程1.多线程介绍,略2.一个简单的多线程程序MSND中参数[in]和[out]的含义要注意#include <windows.h>#include <iostream.h>
DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data);
DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data);int index=0;int tickets=100;HANDLE hMutex;互斥对象的句柄void main(){HANDLE hT...
第16课 1.事件对象:来实现线程的同步。与互斥对象一样均属于内核对象。 当人工重置有信号时,所有线程均得到信号,所以不能设为人工重置。代码就不贴了。 通过创建匿名的事件对象,也可以让一个程序只能运行一个实例。 2.关键代码段实现线程的同步:类似公用电话亭,只有当电话亭里面没人了,其它人才可以再进去打电话。用了4个函数,这种方法比较简单!但缺点是如果使用了多少关键代码码,容易赞成线程的死锁3.线程死锁,用关键代码示例,用了两个临界区对象,实战中要注意避免这种错误!4.使用异步套接字编写网络聊天室 1)加载套接字库,进行版本协商,包...
第17课 进程间通信有四种方法1.剪贴板 a.创建个ClipBoard的对话框应用程序,加两EditBox和两个Button发送接收。 b.具体代码: 发送端代码:if(OpenClipboard()){ CString str; HANDLE hClip; char *pBuf; EmptyClipboard(); GetDlgItemText(IDC_EDIT_SEND,str); hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1); pBuf=(char*)GlobalLock(hClip...
第18课 ActiveX编程(下面X均为ActiveX简称)1.在VB中调用X控件,添加方法 project->Add components。另外可以用Object Browser来查看控件2.在VC中创建X控件 1.新建一个X工程名为Clock,注意一个文件中可以包含多个控件。 2.保持缺省设置,完成。注意它生成的三个类,以及相关的接口。 3.运行它。选择TSTCON32.exe作为容器。 4.选择Insert Control,此时我们可以看到,它画了一个椭圆。也可以在VB中测试。 5.删除注册信息。用regsvr32 /u +文件名。也可以在菜单选择反注册命令。 ...
第19课 DLL编程1.DLL简介,动态库,静态库。动态库节约磁盘空间,静态库体积大。可以用多种语言编写DLL文件。动态库有两种加载方式:隐式调用和动态加裁!2.新建一个DLL1的dll工程,加入一源文件名为dll1.cpp,加入add和subtract两个函数,注意此时须在函数名前加_declspec(dllexport),并且编译。用dumpbi -exports dll1.dll查看其导出的函数,发现函数名字已经被改成了 ?add@@YAHHH@Z,这种现象叫做名字粉碎,是为了支持函数重载而做的。3.编写一个程序测试DLL,工程名为DllTest,基于对话框的,放置两个按纽add和...
第20课 钩子与数据库编程1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX()2.示例程序: 1.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。 2.在OnInitDialog()中添加代码: g_hWnd=m_hWnd;g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());设置了鼠标钩子g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentTh...
1.检测程序中的括号是否匹配把光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告声。 2.查看一个宏(或变量、函数)的宏定义 把光标移动到你想知道的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的Go To Defition Of …),如果没有建立Browse files,会出现提示对话框,确定,然后就会跳到定义那些东西的地方。 3.格式化一段乱七八糟的源代码
选中那段源代...
Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 1:使用vc开发项目时,常会遇到这种情况: 即明明只改动了一个文件,却要把整个项目全部重新编译连接一次。刚刚连接好,一运行,又提示重新编译连接一次,非常讨厌。这是因为出现了未来文件的缘故。 解决方法: 找出对应文件夹下的debug目录,将未来文件全部delete, 再rebuild all一次。(未来 文件即其创建和修改时间都比系统时间靠后) 2:有时,workspace中的classvi...
Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 1:我怎样才能建立一个等待光标? 调用BeginWaitCursor函数来启动等待光标,调用EndWaitCursor函数 来结束等待光标。要注意,二者都要调用App的成员函数,如下所示: AfxGetApp()->BeginWaitCursor(); // 要做的事 AfxGetApp()->EndWaitCursor(); 2:什么是COLORREF? 我该怎样用它? COLORREF是...
Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 1:使用中文VC(VC++在中文平台下可以使用中文,但编译后那些按钮上的、对话框上的中文都成ASCII码了) 因为VC++在安装时是默认按单字节字符安装的,而中文字符是双字节编码,自然就不能正确显示了。 解决方法: 将VC++光盘上DEVSTUDIO\SHAREDIDE\BIN\IDE路径下的中文资源语言模块Appwzchs.dll拷贝至硬盘DevStudio\SharedIDE\BIN\IDE...
Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。 一,给控件设置焦点的两个方法 1.变量 m_edit1.SetFocus(); 2.控件ID GetDlgItem(IDC_EDIT1)->SetFocus(); 二,设置菜单某项的字体为粗体 CMenu* pMainMenu = AfxGetMainWnd()->GetMenu(); CMenu* pSubMenu = NULL; int i; for (...
五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量...
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。
.BMP:位图资源文件。.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。.C:用C语言编写的源代码文件。.CLW:ClassWizard生成的用来存放类信息的文件。cl...
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证...
(65)树形控件为何闪烁?
我从CTreeCtrl中继承了一个类,以缩进的格式显示节点,现在我碰上些问题,当树被重画两次之后(一次为缺省,另一次为对齐文本时)点选节点树就会闪烁.
1)试一下LockWindowUpdate()API函数。2)试一下加入TVS——HASBUTTONS标志,
ModifyStyleEx(TVS_HASBUTTONS, 0);....//drawingModifyStyleEx(0, TVS_HASBUTTONS);如果它不再闪烁,那么在将其定义为自画属性,用PreCreateWindow()中加入CS——OWNDC。
(66)怎样才能关闭树形控件...
(46) CDC中的竖排文本?
在OnDraw成员函数中我想让文本竖直对齐,但CDC类似乎不支持该处理
方法一:如果你的竖直对齐是指旋转文本的话,下面的代码会对你有帮助:该代码检查一个Check box控制,查看文本是否需要旋转.
// m_pcfYTitle is a CFont* to the selected font.// m_bTotateYTitle is a bool (==TRUE if rotated)
void CPage1::OnRotateytitle(){LOGFONT lgf;m_pcfYTitle->GetLogFont(&lgf);m_bR...
(31)DLL中的模板成员函数?
在一个DLL中,我在自己创建的类中使用了模板成员函数来代替预处理宏.但出现以下错误:
error C2664: 'double Data::extract(double &)' : cannot convert parameter 1 from 'class CArray' to 'double &'为什么在匹配模板定义时它要寻找一个DOUBLE参数?
我觉得你可能是在表达成员函数(内联)时出现了问题,请参照下面的示例:
class AFX_EXT_CLASS Data : public CObject //...
(16)如何使用COleClientItem的IDispatch接口?我创建了一个如何使用COleClientItem对象,我想使用它的自动化方法.有什么方法来获得IDispatch的接口?我试过以CCmdTarget为基类的的GetIDispatch函数但却出错,我用过EnableAutomation和GetIDispatch,却什么也没得到.
MSDN中有一篇关于这个的文章(TN039).如下的代码也可能是你所需要的:
LPDISPATCH CMyClientItem::GetIDispatch(){ ASSERT_VALID(this); ASSERT(m_...
(1)当文档被修改时,如何在标题上加上标志'*'?重载CDocument类的虚函数virtual SetModifiedFlag:
void CTest2Doc::SetModifiedFlag(BOOL bModified){ CString strTitle = GetTitle(); CString strDirtyFlag = " *"; // note space before the '*' // so we don't break Save As dialog
if (!IsModified() &&...
[演讲内容]
耶鲁的毕业生们,我很抱歉——如果你们不喜欢这样的开场。我想请你们为我做一件事。请你---好好看一看周围,看一看站在你左边的同学,看一看站在你右边的同学。
请你设想这样的情况:从现在起5年之后,10年之后,或30年之后,今天站在你左边的这个人会是一个失败者;右边的这个人,同样,也是个失败者。而你,站在中间的家伙,你以为会怎样?一样是失败者。失败的经历。失败的优等生。
说实话,今天我站在这里,并没有看到一千个毕业生的灿烂未来。我没有看到一千个行业的一千名卓越领导者,我只看到了一千个失败者。你们感到沮丧,这是可以理解的。为什么,我,埃里森,一个退学生,竟...