小技巧、小经验

来源:互联网 发布:revit软件正版多少钱 编辑:程序博客网 时间:2024/04/26 05:54


(1)、支持ActiveX,调整IE浏览器安全级别

REM ActiveX的注册表项REM 值         设置 REM ------------------------------ REM 0        我的电脑 REM 1        本地 Intranet 区域 REM 2        受信任的站点区域 REM 3        Internet 区域 REM 4        受限制的站点区域   REM 1001     下载已签名的 ActiveX 控件 REM 1004     下载未签名的 ActiveX 控件 REM 1200     运行 ActiveX 控件和插件 REM 1201     对未标记为安全的 ActiveX 控件进行初始化和脚本运行 REM 1405     对标记为可安全执行脚本的 ActiveX 控件执行脚本 REM 2201     ActiveX 控件自动提示 reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1001" /t REG_DWORD /d 1 /freg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1004" /t REG_DWORD /d 1 /freg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1200" /t REG_DWORD /d 0 /freg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1201" /t REG_DWORD /d 1 /freg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1405" /t REG_DWORD /d 0 /freg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "2201" /t REG_DWORD /d 0 /fecho. & pause

(2)、查看WindowsSdkDir路径,打开Visual Studio 2008 Command Prompt控制台,输入命令set


(3)、VC++2005、VC2008中Release版本设置为可调试的设置方法

①、很多时候需要在Release版本下调试程序,可以使用以下方法设置:
1、无效断点所在的项目和启动项目的设置:项目->属性->配置属性->C/C++->常规->调试信息格式,这里不能为『禁用』;
2、项目->属性->配置属性->链接器->调试->生成调试信息,这里设为『是』;
3、C/C++->优化->优化选择『禁用』;
4、删除解决方案下的.ncb文件;
5、工具->选项->调试->『要求源文件与原始版本完成匹配』去掉勾;
6、最后在上述设置的情况下,重新编译整个解决方案;

②、经过试验,在VC2008下,新建一个项目的默认设置情况下,只需修改下面设置就可以调试release版本
1、在release模式下,修改 “项目->属性->配置属性->C/C++->优化->优化”  为 “禁用”,即可以调试。


(4)关于VC的dialog框PreTranslateMessage不响应现象及解决办法 

http://blog.csdn.net/fjssharpsword/article/details/6579704


(5)使得OCX控件响应PreTranslateMessage消息的步骤
http://blog.csdn.net/one_in_one/article/details/6974027


(6)从海康7816的ps流里获取数据h264数据

http://blog.csdn.net/wwyyxx26/article/details/15224879


(7) VS2008远程调试
http://www.cnblogs.com/qfcndtt/archive/2012/04/28/2475470.html

http://blog.csdn.net/rabbit729/article/details/6657285


(8)Process Explorer

是个好工具,可以确定ocx文件以及加载的dll路径是否符合预期。


(9)利用C++调用ping命令

#include <windows.h>#include <stdio.h>char cmdstr[256];int i;int YN(int k) {    FILE *f;    char fn[40];    char ln[80];    int yn=0;    sprintf(fn,"d:\\ping%d.txt",k);    f=fopen(fn,"r");    if (NULL!=f) {        fgets(ln,80,f);        fgets(ln,80,f);        fgets(ln,80,f);        if (1==fscanf(f,"Re%c",&yn)) yn='q'-yn;        fclose(f);        unlink(fn);    }    return yn;}void main() {    for (i=115;i<130;i++) {        sprintf(cmdstr,"cmd /c ping 192.168.2.%d -n 1 -w 1000 >d:\\ping%d.txt",i,i);        WinExec(cmdstr,SW_HIDE);    }    Sleep(3000);    for (i=115;i<130;i++) {        printf("%d 192.168.2.%d\n",YN(i),i);    }}//1 192.168.2.115//0 192.168.2.116//0 192.168.2.117//0 192.168.2.118//1 192.168.2.119//0 192.168.2.120//0 192.168.2.121//0 192.168.2.122//1 192.168.2.123//0 192.168.2.124//0 192.168.2.125//1 192.168.2.126//0 192.168.2.127//1 192.168.2.128//0 192.168.2.129

C++实现Ping

http://write.blog.csdn.net/postedit/47007347


(10)创建表方式以及表结构如下:
         CppSQLite3DB m_db;
         std::string sql = "create table ";
         sql += TableName_Service();
sql += "(id integer primary key autoincrement,"
                " sevname text not null,"
                " sevitem text not null,"
                " sevrecordval text not null,"
                " sevcurval text not null,"
                " date timestamp not null);";
         m_db.execDML( sql.c_str() );


C++访问sqlite数据库之select(查询)

/*开始由于受官方网站和网上copy例子的影响,走了弯路后来根据官方文档的介绍,一步一步尝试,终于搞定了*/

map<int,MyParaStruct> m_MyDevPara_Struct;//因为这个读数据库是一行一行读的,我觉得用stl(标准模板库)的map是
                                                          //比较方便的一种方式,MyParaStruct是自定义的一个结构体,用来存放每一列的参数
 if(mydb==0)MyOpen();
 string s("select * from my_xxx_table");
 s.push_back(';');//sqlite数据库中sql语句以";"结尾
 sqlite3_stmt **ppStmt;
 struct sqlite3_stmt mm;

 const char *ps = s.c_str();
 const char **pzTail = &ps;
 sqlite3_prepare_v2(mydb,s.c_str(),60,ppStmt,pzTail);
 int ret = -1;//
 int i = 0;
 ret = sqlite3_step(*ppStmt);//sqlite3_step返回值

while(ret!=SQLITE_DONE)//当前表还没用读完
 {

  MyParaStruct m_QueryPara;

 //读到一行之后,以列标号来读每一列的值
  m_QueryPara.type     = sqlite3_column_int(*ppStmt,0);//

  m_QueryPara.sub_type     = sqlite3_column_int(*ppStmt,1);//

  m_QueryPara.addr     = sqlite3_column_int(*ppStmt,2);
  ....
  ....
  ....
 m_MyDevPara_Struct[i] = m_QueryPara;

 ret = sqlite3_step(*ppStmt);

 i++;
 }

//读完之后,i为表的行数

//搞定了查询,现在没找到sqlite3_stmt 结构体的定义,不知道update时如何绑定值到变量,有知道的请不吝赐教,谢谢!!


(11)、计算运行时间:

方法1、

CTime time1 = CTime::GetCurrentTime();CTime time2 = CTime::GetCurrentTime();CTimeSpan span=time2-time1; //计算当前系统时间与时间t1的间隔int iSec=span.GetTotalSeconds();//获取总共有多少秒

方法2、

time_t  nowtime;int iCurTime1,iCurTime2;iCurTime1 = time(&nowtime);iCurTime2 = time(&nowtime);DEBUG_TRACE("Time = %d \n",iCurTime2-iCurTime1);

(12)、编译器内置宏

编译器内置宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。例如:
printf("FILE: %d,  LINE: %d, %s/n", "__FILE__, __LINE__,  "这里写上相关信息");

ANSI C标准中几个标准预定义宏:
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。


(13)、Socket的正确关闭(改良版)

http://blog.csdn.net/hunkcai/article/details/5803651


(14)、Advanced Installer 备忘

这个重点是Product Version。讲这个之前,首先要知道Product Code和Upgrade Code这两个属性,同时大家不要被这两个英文词语的字面意思所以迷惑。

同一款产品,不同的版本的安装包,Product Code必须不同,但Upgrade Code必须相同。

例如,现在有一款软件叫"Hello World”,已经制作了1.0.0的安装包,现在要制作1.0.1安装包。1.0.0与1.0.1的Upgrade Code是相同的,否则就会视为不同产品的安装包,安装时就会产生两个卸载项目。而同时1.0.0与1.0.1的Product Code是不一样的,否则系统会误认为同一版本的安装包,到时候就无法正确安装了。

了解了上述的含义就好理解Product Version。只要改变Product Version的版本号,就会自动改变Product Code,方便我们制作完全升级包。

http://www.cnblogs.com/xyq/archive/2010/10/21/1857172.html


(15)、为什么设置不了控件Groupbox的背景透明?
答:经过多次的测试,发现:
1、 直接拖一个控件到界面上,通过属性栏里设置Transparent的值为TRUE,可以实现我需要的效果。而且这个的Group Box背景和DLG一致。
2、属性栏里的Transparent值为FALSE。加入如下WM_CTLCOLOR消息代码处理,无效。
C/C++ codeif(nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)::GetStockObject(NULL_BRUSH); } 后修改下,修改后代码:
C/C++ codeif(nCtlColor == CTLCOLOR_DLG) { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)::GetStockObject(NULL_BRUSH); } 想把DLG界面的背景透明掉,但是还是没成功,背景依然存在。
3、动态创建一个Group box控件,加入属性,代码如下。显示的效果还是达不到第一效果。
C/C++ codeCButton* btn = new CButton(); btn->Create("static",WS_EX_TRANSPARENT|BS_GROUPBOX/*|BS_NOTIFY*/|WS_VISIBLE|WS_CHILD, ret,this,533525); btn->ShowWindow(1); 见图,第一个Group box是在属性栏里设置 Transparent为TRUE的效果, 第二个Group box的Transparent值为FALSE,但是做了上面第2个方案处理了。但是效果就不能和第1个Group box效果一样了。
------解决方案-------------------------------------------------------- pDC->SetBkMode(TRANSPARENT);
只对“Static”标题内的区域有效,不是整个控件透明。
------解决方案--------------------------------------------------------可以设置.
C/C++ code if(pWnd->GetDlgCtrlID()==IDC_COM_SEX) { [color=#FF0000]pDC->SetBkMode(OPAQUE);[/color] pDC->SetBkColor(RGB(180,230,255)); return m_brush; }
------解决方案--------------------------------------------------------ModifyStyleEx().
------解决方案--------------------------------------------------------建议自绘
------解决方案--------------------------------------------------------我一般都是直接在背景上自己画了


(16)、text、static控件设置notify为true,可以触发鼠标事件,Groupbox设置Transparent为true,画面不会留阴影;


(17)、宏定义输出当前时间:

 #define CURRENT_TIME() {\ char     szBuffer[128];\time_t current_time ;\struct tm* pcurrent_tm ;\time(&current_time) ;\pcurrent_tm = localtime(&current_time) ;\sprintf(szBuffer, "%04d-%02d-%02d %02d:%02d:%02d",\(pcurrent_tm->tm_year + 1900), (pcurrent_tm->tm_mon + 1), pcurrent_tm->tm_mday,\pcurrent_tm->tm_hour, pcurrent_tm->tm_min, pcurrent_tm->tm_sec);\OutputDebugString(szBuffer);\}


CTime date,time;m_tmDate.GetTime(date);m_tmTime.GetTime(time);char buf[MAX_PATH]={0};/*sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d",date.GetYear(),date.GetMonth(),date.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());*/CTime tm(date.GetYear(),date.GetMonth(),date.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());CTime baseTime(1970,1,1,8,0,0);CTimeSpan span = tm-baseTime;sprintf(buf,"%d",span.GetTotalSeconds()+28800);pRecord->picList[0].irregulatitiTime = buf;TRACE("1970年1月1日0点至今总秒数==%s",buf);CTime curTime(date.GetYear(),date.GetMonth(),date.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());int nTSeconds = curTime.GetTime();TRACE("1970年1月1日8点至今总秒数==%d\n",nTSeconds);char     szBuffer[128];time_t current_time = nTSeconds;//总秒数转换为time_tstruct tm* pcurrent_tm ;//time(&t_time) ;pcurrent_tm = localtime(&current_time) ;sprintf(szBuffer, "%04d-%02d-%02d %02d:%02d:%02d",\(pcurrent_tm->tm_year + 1900), (pcurrent_tm->tm_mon + 1), pcurrent_tm->tm_mday,\pcurrent_tm->tm_hour, pcurrent_tm->tm_min, pcurrent_tm->tm_sec);


(18)、用DOS命令从远程连接的电脑上下载文件

用DOS命令从远程连接的电脑上下载文件,方法如下:

1、打开telnet后,在运行里面输入:\\ip地址\盘符$;
其中,ip地址即对方的ip,盘符是想映射的分区符;
例如:\\192.168.1.1\C$;
这样子就打开了192.168.1.1的c盘。

2、直接可以从c盘来下载或者复制文件了。

本地拷贝到服务器上的共享目录


(19)、每个tab页面一个非模态对话框,切换页面时,之前的页面会被释放,先执行OnDestroy、后执行PostNcDestroy;


(20)、 DbgView调试信息查看器。这是一款软件开发者常用的软件,往往一款软件在Debug下调试好了,可是在Release下可能还存在Bug,如何才能输出调试信息呢,全能调试器是解决您的问题的好帮手。DbgView调试信息查看器不仅仅能作为调试信息输出,而且可以作为一个信息输出软件,监视您的软件运行,目前支持mfc和windows下dos信息输出。

0 0
原创粉丝点击