1,typedef DWORD ( winapi * pthread_start_routine ) ( pvoid pvparam )用法
类似于
typedef int size;
此声明定义了一个 int 的同义字,名字为 size
PVOID:如果该函数执行失败,那么其返回值为NULL;否则,PVOID指出一个数据块的内存地址。
2,typedef unsigned (__stdcall *PTHREAD_START) (void *);用法:
PTHREAD_START为特定原型函数指针类型的别名,我们可以使用这个类型别名来定义一个特定原型函数的指针。
如果没有这个PTHREAD_START的typedef定义,那么我们每次要实现这个功能——定义该原型函数的指针时都要这么写:
unsigned (__stdcall *pThreadProc) (void *); //定义一个符合上述原型的函数的指针
pThreadProc = 某某函数名;
有了这个typedef定义,我们就可以利用这个类型别名来定义变量,如:
PTHREAD_START pThreadProc;
pThreadProc = 某某函数名;
显然这样既方便又增加了程序的可读性。
3,__stdcall函数
int __stdcall vvfcdxa·(int a,int b)
stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。
以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处
翻译成汇编语言将变成:
push 2 第二个参数入栈
push 1 第一个参数入栈
call function 调用参数,注意此时自动把cs:eip入栈
而对于函数自身,则可以翻译为:
push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向a
add eax,[ebp + 0CH] 堆栈中ebp + 12处保存了b
mov esp,ebp 恢复esp
pop ebp
ret 8
而在编译时,这个函数的名字被翻译成_function@8
注意不同编译器会插入自己的汇编代码以提供编译的通用性,但是大体代码如此。其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。
从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。函数结束后,ret 8表示清理8个字节的堆栈,函数自己恢复了堆栈。
4,__FILE__和__LINE__用法?
用语句"cout<<__FILE__;"可以输出当前被编译的文件的名字,也就是输出,这个语句所在文件的名字.
用语句"cout<<__LINE__;"可以输出当前被编译的文件的被编译的行数.
5,
#define chHANDLE_DLGMSG(hWnd, message, fn) /
case (message): return (SetDlgMsgResult(hWnd, uMsg, /
HANDLE_##message((hWnd), (wParam), (lParam), (fn))))
对于HANDLE_##message 中##,实际上编译器对这个符号的处理很简单,就是将两个字符串进行连接。
比如当messge = WM_INITDIALOG的时候,他就变成了如下形式:
#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) /
(LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam)
而上面这些宏都是在windowsx.h中已经定义好了的!!!!
而
<strong>SetDlgMsgResult( HWND</strong> <em><a target=_blank class="synParam">hwnd</a></em><strong>, int</strong> <em><a target=_blank class="synParam">msg</a></em><strong>, LONG</strong> <em><a target=_blank class="synParam">result</a> </em> <strong>);</strong>
Parameters
-
hwnd
- Handle to the dialog box. msg
- Specifies the zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus four. result
- Specifies the replacement value.
这个函数的作用就是讲对话框上的消息交给哪个消息处理函数来处理!
无非就是调用自己定义的消息处理函数!!
很容易理解!
所在目录:windowsx.h
6,加载图标
骤一:切换到Resource选项卡,导入一个ico文件,右击图标文件,选择properties选项,在ID中更改它的名字,如:IDI_ICONAPP,在头文件夹中导入资源头文件(resource.h)步骤二://载入图标HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));步骤三://SendMessage(hwnd, WM_SETICON, TRUE, (LPARAM)hIcon);
//SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);备注:WM_SETICON Message
一个应用程序发送WM_SETICON消息来将一个大图标或一个小图标与一个窗口相关联。大图标将在按下ALT+TAB组合键时显示,小图标将在窗口的标题栏内显示。
语法lResult = SendMessage( // returns LRESULT in lResult
hWndControl, // (HWND) handle to destination control
WM_SETICON, // (UINT) message ID
wParam, // = () wParam;
lParam // = () lParam;);参数wParam指定图标的类型。该参数可以为下列值之一:
ICON_BIG=true
为窗口设置大图标
ICON_SMALL=false
为窗口设置小图标lParam新的大、小图标的句柄。如果该参数为NULL,由wParam参数指定的图标将会移除。