2013年11月20日

C++ 通过Thunk在WNDPROC中访问this指针实现细节

摘要: 本文代码使用了一些C++11特性,需要编译器支持。本文仅讨论x86_64平台的相关实现,x86平台理论上只需修改 thunk 相关机器码即可。THUNK的原理参见之前的一篇博文《C++ 通过Thunk在WNDPROC中访问this指针》首先定义我们的window类,该类实现对一个Win32窗口句柄的封装。该类将在构造函数中创建窗口,在析构时销毁窗口;窗口的消息过程函数(WindowProc)将是一个用机器码在内存中动态构造的thunk,其作用是把收到的4个参数中的第一个也就是窗口句柄替换成window类的this指针,然后把调用传递给window类的静态函数static_procedure;静 阅读全文

posted @ 2013-11-20 23:22 Todd Pointer 阅读(1817) 评论(0) 推荐(1)

Unicode 字符集及UTF-8 UTF-16编码

摘要: 很久以前发在他处的一篇博文,今天翻出来重新整理了一下Unicode 字符集 共分为 17 个平面(plane), 分别对应 U+xx0000 - U+xxFFFF 的 code points, 其中 xx := 00 - 10。其中第 0 平面不包含为 UTF-16 编码保留的 U+D800 - U+DFFF。第0平面包含了最常用的字符,被成为 Basic Multilingual Plane 或 BMP (基本多语言平面)。Unicode 在编码上有多种实现,常见的有 UTF-8, UTF-16, UCS-2(已过时), UTF-32(UCS-4)等。UTF-8 编码UTF-8是一种变长、多 阅读全文

posted @ 2013-11-20 00:18 Todd Pointer 阅读(891) 评论(0) 推荐(0)

2013年11月17日

C++11 可变参数模板

摘要: 在C++11之前, 有两个典型的受制于模板功能不强而导致代码重复难看的问题, 那就 function object 和 tuple。 拿 function objects 来说, 需要一个返回类型参数及N个参数类型参数。 但因为变长参数模板不受支持,导致不得不重复书写7、8个模板类,但最终也只能支持7、8个参数的 function object。C++11中最终为我们带来了强大的变长 参数模板功能,这些问题也随之迎刃而解了。可变参数模板(Variadic Template)故名思义,即可以接受任意数量参数的类/函数模板。 其声明方式为templateclass VariadicTemplate 阅读全文

posted @ 2013-11-17 21:33 Todd Pointer 阅读(2004) 评论(0) 推荐(1)

C++ 匿名名字空间及静态非成员函数

摘要: 在C++中,static有一个感觉被较少提及的用法:修饰非成员函数,这个用法实际是从C语言继承来的。其作用是表明这个函数只在当前编译单元中有效。这就使这个函数的所有引用在编译时就可以全部确定,无需进入链接阶段,链接器没有机会看到这个函数相关的一切符号,无论导入还是导出(理论上,实际编译器如何处理这个事情可能不尽相同,未作深入研究)。即使多个编译单元都包含相同的signature相同名字的函数,链接器也不会报错或合并符号。比如以下代码:// main.cppvoid foo();void bar();int main(int argc, const char* argv[]) { foo(... 阅读全文

posted @ 2013-11-17 00:56 Todd Pointer 阅读(776) 评论(0) 推荐(0)

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 阅读(573) 评论(0) 推荐(0)

导航