1.如何配置vs的可执行exe、dll的路径。
这么设置的话就不用再在系统的path路径下设置了。
2.如何解决winh.h出现语法错误的问题,这一般是由于打开老版本的directShow引起的。
解决方法是把DirectX的include文件放到sdk的include路径的后面见图,这个要手工添加不能按下黑色的小三角使用对话框添加。:
3.出现char与Cstring转换错误,这是由于Cstring是宽字符,转换的时候出错了。去掉工程的Unicode支持就可以了
4.在mfc程序中,是不可以调用AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0)这个函数的,因为在mfc程序框架中已经调用过了。
5.标准c++中的std::string 转换成char*的做法:
string 转化 char类型 string str; char *a; a=str.c_ctr();
6.如何立即重绘mfc窗口
在view类中调用:
this->Invalidate();
//this->UpdateWindow();
7.class重定义。
原因是.h文件被多次包含,解决办法:在头文件中加入
#pragma once
8.在c++类的静态变量 a例如:
class t
{
static int a ;
void hello();
};
在初始化时应该采用
int t::a = 3;
的形式。否则会产生link 错误:无法解析的外部符号:a之类的错误。
9. vs2010 错误提示框:文件加载 使用 简体中文(GB2312)编码加载文件C:\Users\Administrator\AppData\Local\Temp\nxhgjasi.5au\Temp\Properies\AssemblyInfo.cs时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。 解决方法
http://mituhao.diandian.com/post/2012-01-05/40027609137
利用上面的网址介绍的方法大部分人发现根本不能用,因为大部分人的vs上面的那个选项的对勾是打上的,解决方法是:
(1)在那个选项上的对勾去掉,点击确定。
(2) 重启vs
(3) 把那个对勾选上。
(4)重新启动vs。ok问题解决。
我出现这个问题的原因是由于我使用了ue的列模式,然后直接保存了,没有转换成行模式。
10:在windows sdk环境下使用多线程编程:
多线程编程的难点在于同步,
#include<Windows.h>
#include<process.h>
#include<iostream>
DWORD WINAPI thread(LPVOID pvoid)
{
HANDLE hMutex = (HANDLE)pvoid;
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
std::cout<<"thread"<<std::endl;
ReleaseMutex(hMutex);
}
return 0;
}
int main()
{
HANDLE hMutex;
hMutex = CreateMutex(NULL,FALSE,"onlyOne");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS == GetLastError() )
{
std::cout<<"alread run"<<std::endl;
return -1;
}
}
//_beginthread(thread,0,NULL);
HANDLE hTread1= CreateThread(NULL,0,thread,(LPVOID)hMutex,0,NULL);
CloseHandle(hTread1);
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
std::cout<<"main"<<std::endl;
Sleep(200);
ReleaseMutex(hMutex);
}
}
11.如何把int型转换成string或者char*型:利用sprintf函数完美解决。
参考网址:http://bbs.csdn.net/topics/220013347
#include<iostream>
int main()
{
int a = 20;
char buf[10];
sprintf(buf,"%d",a);
std::cout<<buf<<std::endl;
std::cin>>a;
return 0;
}
12.如何在c++(vs2010环境)中写相对路径。
#include<iostream>
#include<opencv\cv.h>
#include<opencv\highgui.h>
using namespace cv;
using namespace std;
int main()
{
cv::Mat mat= imread("hello.jpg");
char *t = "./tt/temp.jpg";
if( imwrite(t,mat) == false)
std::cout<<"tt"<<std::endl;
return 0;
}
13在c++类中实现多线程。
http://hi.baidu.com/neutblue/item/eeea9d7e60edc92fd6a89c62
http://blog.sina.com.cn/s/blog_4cce4f6a0100buel.html
我推荐使用的一种方法:使用友元函数方法:友元函数既是一个独立的函数,又可以访问类中的私有变量,又符合线程要求是一个独立函数的要求,所以我认为是实现多线程的很好的一个选择。
#include<iostream>
#include<process.h>
#include<Windows.h>
class t;
void setA(t &_t,int b);
class t{
public:
friend void setA(PVOID pvoid );
private:
int a;
};
struct param{
public:
t &_t;
int b;
};
void setA(PVOID pvoid )
{
//t *ptr = (t*)pvoid ;
param *ptr = (param *)pvoid ;
for(int i=0;i<20000;i++)
{
ptr->_t.a = 2;
std::cout<<ptr->_t.a<<std::endl;
}
}
void main()
{
t _t;
int b = 0;
param p ={_t,b};
param *ptr = &p;
_beginthread(setA,0,&p);
Sleep(3000);
std::cout<<"main()"<<std::endl;
//std::cout<<_t.a <<std::endl;
}
14:处理时间的函数:
http://blog.csdn.net/coder_xia/article/details/6566708
另外补充:time函数在windows系统中的单位是秒。
15:
VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决办法:
http://longtianyu1.blog.163.com/blog/static/99819652012113112827491/
终极解决方案:
VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”。
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:
计算机是否为64bit操作系统,如是,继续2。
查找是否有两个cvtres.exe。一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另一个是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe。右键属性|详细信息 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。
意外的是,治本的办法是第三步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。
16 如何调试mfc程序。
wchar_t *test = L"hello";
OutputDebugString(test);即可在输出窗口出现调试出的“hello”字符串
TRACE("Create database successful."); 可以起到跟他一样的效果。
17: 使用std::vector 删除元素。
#include<vector>
#include<iostream>
using namespace std;
void main()
{
vector<int> a ;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
vector<int>::iterator it;
for(it = a.begin();it != a.end();it++)
{
if(*it== 3)
{
it = a.erase(it);
}
cout<<*it<<endl;
}
}
18:如何避免出现空悬指针
delete p;
p = nullptr;
19:在c++中如何存储位
std::bitset
20.在mfc中如何使用cArray。
http://msdn.microsoft.com/en-us/library/ms926680 msdn文档。
http://blog.csdn.net/password318/article/details/6858647 carray的使用例子
carray分的种类可以参看msdn文档。使用例子见下:
void ClllView::OnDraw(CDC* /*pDC*/)
{
ClllDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
//OutputDebugString(L"ttt");
CArray<CPoint,CPoint&> m_Array;//普通array使用
m_Array.SetSize(10,10);
CPoint pt1(10,10);
m_Array.Add(pt1);
CPoint pt2(10,50);
m_Array.Add(pt2);
CPoint pt3(10,100);
CPoint pt4(200,33);
m_Array.Add(pt3);
m_Array.Add(pt4);
int size = m_Array.GetSize();
CClientDC dc(this);
dc.MoveTo(0,0);
CPoint pt;
for(int i=0;i<size;i++)
{
pt= m_Array.GetAt(i);
dc.LineTo(pt);
OutputDebugString(L"tt");
}
CStringArray ar;//cstringarray使用
CString str("111111");
ar.Add(str);
OutputDebugString(str.GetString());
// TODO: 在此处为本机数据添加绘制代码
}
21:ctime的使用
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%H:%M:%S");
pdc->TextOutW(0,0,str);
22:MFC中的定时器的KillTimer(IDTIMER1)函数应该在窗口销毁之前调用,否则就会出现断言错误。SetTimer(IDTIMER1,1000,NULL);函数应该在窗口创建之后调用,否则同样会出现错误。
23:mfc的Cstring转换成double是atof,double转换成Cstring是formate。%lf。
24:使窗口处在最 前面
CRect rcMy;
::GetWindowRect(m_hWnd, rcMy); //得到当前的窗口位置
//设为总在最前
SetWindowPos(&wndTopMost, rcMy.left, rcMy.top, rcMy.Size().cx, rcMy.Size().cy, SWP_SHOWWINDOW);
//取消总在最前
//SetWindowPos(&wndNoTopMost, rcMy.left, rcMy.top, rcMy.Size().cx, rcMy.Size().cy, SWP_SHOWWINDOW);
http://blog.csdn.net/zhuce0001/article/details/8990850
26:串口的写法:
m_portNum="\\\\.\\COM10";不应该只写com10