2013年11月16日

C++ 通过Thunk在WNDPROC中访问this指针

摘要: 本文基本只讨论原理,具体实现请参见后续文章《C++ 通过Thunk在WNDPROC中访问this指针实现细节》当注册窗口类时,WNDCLASSEX结构的lpfnWndProc成员应设置为窗口过程函数的地址,这是一个C风格的函数指针,所以我们只能使用全局或静态函数的地址,这在我们将窗口封装为C++类时会很麻烦,因为我们无法在一个全局或静态的WindowProc函数中直接访问类实例,这就需要一些手段了(MS的API设计着实不怎么样) 第一种方案,建立一个HWND到C++类实例的映射表,在WindowProc中通过这个映射表从HWND得到C++类实例,由于可能有多线程安全问题,在访问这个映射表时可. 阅读全文

posted @ 2013-11-16 16:33 Todd Pointer 阅读(1235) 评论(2) 推荐(0)

C++ Template Specialization (模板特化)

摘要: 个人理解这个东西说白了就是当模板类(或函数)的类型参数为某特定值时用对应的特化定义代之。看个例子吧#include using namespace std;templatestruct is_void { static const bool value = false;};/* 上面的代码定义了一个简单的模板结构is_void的主版本,无论类型参数T是何值, * 结构体的静态常量成员value的值都是false,这当然是无意义的,我们需要当且 * 仅当类型参数T为void时,value成员的值为true,于是我们定义下面的特化版本 */templatestruct is_void { ... 阅读全文

posted @ 2013-11-16 15:21 Todd Pointer 阅读(2321) 评论(0) 推荐(0)

Event — Windows API

摘要: Event即事件是一种用于进行线程/进程间同步的对象,事件有置位和复位两种状态,当线程通过waiting functions等待Event对象置位时该线程将进入阻塞状态,当该Event对象被置位或等待超时后,等待的线程将恢复执行。Event可以用在一个线程要等待其它线程时。可以使用CreateEvent创建Event对象HANDLE WINAPI CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName);lpEv... 阅读全文

posted @ 2013-11-16 15:08 Todd Pointer 阅读(836) 评论(0) 推荐(0)

Semaphore — Windows API

摘要: Semaphore是旗语的意思,在Windows中,Semaphore对象用来控制对资源的并发访问数。Semaphore对象具有一个计数值,当值大于0时,Semaphore被置信号,当计数值等于0时,Semaphore被清除信号。每次针对Semaphore的wait functions返回时,计数值被减1,调用ReleaseSemaphore可以将计数值增加 lReleaseCount 参数值指定的值。CreateSemaphore函数用于创建一个SemaphoreHANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttri... 阅读全文

posted @ 2013-11-16 15:02 Todd Pointer 阅读(900) 评论(0) 推荐(0)

Mutex — Windows API

摘要: Mutex是互斥体的意思,当一个线程持有一个Mutex时,其它线程申请持有同一个Mutex会被阻塞,因此可以通过Mutex来保证对某一资源的互斥访问(即同一时间最多只有一个线程访问)。调用CreateMutex可以创建或打开一个Mutex对象,其原型如下HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName);其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表明是... 阅读全文

posted @ 2013-11-16 14:56 Todd Pointer 阅读(574) 评论(0) 推荐(0)

导航