问题解决方案之VC++
文|Seraph
本文档主要记录VC编程过程中,经常遇到的一些问题,以供大家参考。
一、开发多文档形式在初始化时,使其框架以及视图最大化
- 框架最大化为在应用程序类的初始化函数中添加如下代码:
BOOL CMDIAppDemoApp::InitInstance(){......pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);// pMainFrame->ShowWindow(m_nCmdShow);pMainFrame->UpdateWindow();......}- 视图最大化在子窗口类中做如下操作:
//添加CChildFrame类的ActivateFrame虚函数voidCChildFrame::ActivateFrame(intnCmdShow){nCmdShow=SW_MAXIMIZE;//添加CMDIChildWnd::ActivateFrame(nCmdShow);}二、CString 与 char 、BYTE之间的转换(vs05之后要先将CString转为CStringA)
- CString转char
- 通用(借CStringA做中转)
CString m_cstr;m_cstr="adc";CStringA m_cstrA;m_cstrA=m_cstr;char*lp;lp=m_cstrA.GetBuffer(m_cstrA.GetLength());- 分类型转化方式:
多字节字符集情况下
char *s=(LPSTR)(LPCTSTR)str;Unicode字符集情况下
int n = str.GetLength(); //按字符计算,str的长度 //按Byte计算str长度 int len = WideCharToMultiByte(CP_ACP,0,str,n,NULL,0,NULL,NULL); //按字节为单位 char *pChStr1 = new char[len+1]; //宽字节转换为多字节编码 WideCharToMultiByte(CP_ACP,0,str,n,pChStr1,len,NULL,NULL); pChStr1[len] = '\0';//不要忽略末尾结束标志- T2A,W2A
USES_CONVERSION;//声明标示符//调用函数,T2A和W2A均支持ATL和MFC中字符转换//char *pChStr2 = T2A(str);char*pChStr2=W2A(str);//也可以实现转换- CString转BYTE
CString m_cstrw; m_cstrw="123";CStringA m_cstr;m_cstr=m_cstrw;BYTE*m_byte;m_byte=newBYTE[100];m_byte=(BYTE*)m_cstr.GetBuffer(m_cstr.GetLength());//cstring转BYTE- char与BYTE转换
强制转换就行
三、release编译下和直接运行EXE的结果不用
- 动态库资源缺失
- 文件访问路径错误
- 优化问题
四、VC线程退出的方法
循环进入标志使用一个全局判断标志,如定义一个g_bExitThread
**缺点:**如果线程执行时间过长,会导致,执行g_bExitThread=0;语句后,立即执行后面的函数,不能等待线程结束。
当然,你可以使用sleep来保证线程结束后再执行后面语句,但是这种效率比较低,时间也不是很好把控。再者CPU时间是分片的,不能保证全部时钟周期都用来运行线程,所以也就无法准确地估计线程最长运行时间。通过WaitForSingleObject来获取线程状态,如果线程退出,执行后面的语句。
大部分多线程情况,如果线程没有退出,会导致程序退出的时候崩溃,所以我们希望能管理全部线程退出的情况。防止程序因为有线程没有退出而出现崩溃的情况。
增加一个ExitApplicationThread线程函数,当程序退出时调用,该函数的作用是检测启动的线程是否退出TerminateThread(ExitThread)终止线程,但是不推荐,因为线程结束时,只能清理操作系统资源,不能清理C++资源(如C++类对象),我们无法确认被结束的线程占用了哪些资源,或许这些资源其他线程正在等待。
所以说,不清理退出,不仅是奢侈的,也是很危险的操作。
五、生成拥有管理员权限的执行文件
- (项目右键—属性—连接器—清单文件—uac执行级别 选择requireAdministrator )中文版
- (project->property->Configuration Properties->Linker->Manifest File->UAC Execution Level 选择requireAdministrator)英文版
重新编译 这样你的程序直接运行就拥有管理员权限了。
六、字节顺对齐
- (project->property->Configuration Properties->Code Generation->Struct Member Alignment)
可以设置结构体多少字节对齐。 - 注意此字节对齐仅适用于本工程产生的执行文件,如调用的DLL默认为其它字节对齐,可能会使调用接口时获取结构体数据偏移对不齐。
我已经没有时间去对我不感兴趣的事情再产生兴趣。------《局外人》
