学习C++的基础知识

消息机制
线程间通讯用到
postthreadmessage() 发送到消息队列 
sendmessage()  发送到窗口过程 等消息被处理后才返回
getmessage()  如果消息队列里没有消息的话一直等待消息才继续执行 
peekmessage() 如果消息队列里没有消息的话那么直接返回
额··· createwindow()返回NULL句柄 getlasterror()返回1407错误 很可能是callback windowproc()回调函数没有写
wndproc是窗口过程用来执行相对应消息的动作 
createwindow的参数类名 与 WNDCLASS的成员类名相同 也就是经RegisterClass()注册过的WNDCLASS

获取本线程ID   GetCurrentThreadId() getthreadid()
获取当前进程ID _getpid() GetCurrentProcessId()
通过窗口句柄获得进程ID GetWindowThreadProcessId()
通过进程ID获得进程句柄 OpenProcess()

捕获运行状态 GetlastErorr() 

静态引用DLL 
DLL放在debug文件夹 ilb和.h放在编译目录

C++遵循最近原则,同名的变量,作用域小的覆盖大的。比如
int i = 3;
{
    int i = 4;
    i = 5;
}
cout << i; //还是3

x86是32位 x64是64位 win32是32位程序。。。。。
编译的64位dll库 将生成在x64下的debug文件夹下

编译的DLL文件 lib文件 在VS项目中调用时需要名字相同

#ifdef _WIN64 用来判断当前环境是不是64位的

通过IsWow64Process来判断是否当前进程是64位 如果系统是64位 进程也是64位的话 返回FALSE

建立进程快照可以浏览他的DLL模块以及其他的信息 createToolhelp32snapshot()
遍历模块  开始module31first() 下一个module32next() 结束返回false
*可以获得进程中的DLL映射地址!!!!!!!!!!!!!!

获得线程的结束码 getexitcodethread() *第二个参数是DWORD的指针 只能捕获32位的返回值!
获得进程的结束码 getexitcodeprocess() 
结束码可以是return返回值 也可以是ExitThread,ExitProcess的退出码
getexitcodethread还可以是进程线程的退出码(每个进程至少有一个线程 这个主线程也就是进程本身)

等待一个线程结束 设置二参数会产生阻塞时间waitforsingleobject()
  
内核对象 用户对象 内核对象都带设置安全属性的 设置安全属性来让子进程or线程来继承父进程的句柄表 
每个进程都有独立的进程表 内核对象是唯一的 在每个进程表里都有内核对象的索引 也就是句柄 
当内核对象被新进程引用时 计数器加一 当内核对象计数器为零时 内核对象自动销毁


打开文件 shellexecute() 打开文档或者exe什么的
createprocess()打开一个进程 其中processinformation概括了子进程的线程句柄和线程ID与进程句柄和进程ID 特别方便

通过createmutex()建立互斥量 进行线程或者进程同步 
获得互斥量所有权 waitforsingleobject()  释放互斥量所有权releasemutex()
返回值WAIT_ABANDONED表示互斥是无信号的 返回值WAIT_OBJECT_0表示是有信号的


提升程序的权限
    编译程序的时候设置一下 
    在项目属性–连接器–清单文件–UAC执行级别改为requireAdministrator

判断进程有没有退出可以用 openprocess() 配合 getexitcodeprocess()

当使用vector或者map时要删除当前迭代器所指控件 可用erase(itor++);

MFC 设置cursor 需要
::LoadCursor(NULL,IDC_HAND);  如果设置系统图标资源 第一个参数必须为空 
::SetCursor(hcursor);

ScreenToClient()是针对当前类的 如果你要获得当前窗口在其他窗口的客户区位置 那么应该使用其他窗口的对象

防止控件界面闪烁频繁
m_procinfo.SetRedraw(FALSE);
---添加代码----
m_procinfo.SetRedraw(TRUE);
m_procinfo.Invalidate();
m_procinfo.UpdateWindow();

需要双缓冲时 list view 控件都能设置TVS_EX_DOUBLEBUFFER双缓冲属性 很管用

遍历主窗口的所有子窗口时使用 EnumChildWindows 还有EnumChildProc回调函数

*引用或者生成动态链接库要根据编译的程序是X64还是X86选择编译

*比较恶心的问题 vs2010编译出现LNK1123问题 解决方式https://wenku.baidu.com/view/196d9745a1c7aa00b52acb98.html

mmp wsprintf用来进行字符串赋值 但是不支持浮点型 可以用swprintf 进行赋值

SOUI 引用资源在uires.idx 在skin.xml里绑定 在dlg_main.xml里使用
SOUI 进度条设置皮肤属性 bkandskin(设置背景皮肤) posskin(设置进度皮肤) *一个列外比如滚动条滑块需要设置的皮肤 thumbSkin(设置滑块皮肤)


写入ini文件的winapi    WritePrivateProfileString   GetPrivateProfileString

#ifdef _DEBUG
#pragma comment(lib,"TinyXMLD.lib")
#else
#pragma comment(lib,"TinyXML.lib")
#endif

通过窗口句柄获得进程IDGetWindowThreadProcessId()

记得生成mfc程序是 最好设置成在在静态库中编译
公共语言运行时支持(/clr),在静态库中使用 MFC,这些必须加上
工程->属性- >配置属性->c++->命令行
结尾加上
/D "_AFXDLL" 


打印输出 STRACE(_T("asdasd")); OutputDebugString

认定一件事:
unicode    ascii(多字节)
wchar_t    char
wstring    string
LPWSTR     LPSTR
LPCWSTR    LPCSTR
至于tchar,LPCTSTR,不建议使用。其实可以看做是宏,
#ifdefine _UNICODE
  #define tchar wchar_t
#else
  #define tchar char
#endif

如果要使用户在不同系统下调用系统接口,可以使用动态加载dll调用函数的方式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值