一种方法:解决方法是在CDialog::PreTranslateMessage() 的重载函数中将ESC和回车按键的消息处理掉.
BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN)
return TRUE;
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_ESCAPE)
return TRUE;
return CDialog::PreTranslateMessage(pMsg);
}
另一种方法:一开始的cancel按扭不要去掉,双击它进入命令OnCancel(), 把OnCancel()去掉直接返回,这就没问题了如果你已经把按钮删掉,那就得手工加这个命令,但效果一样
posted @
2013-09-13 08:31 王海光 阅读(638) |
评论 (0) |
编辑 收藏
1. 首先介绍计算机定义的每个安全区域的项:Zones 。默认情况下,定义以下 5 个区域(编号从 0 到 4):
0 我的电脑
1 本地 Intranet 区域
2 受信任的站点区域
3 Internet 区域
4 受限制的站点区域
注意:默认情况下,“我的电脑”不会出现在“安全”选项卡的“区域”框中。
其中的每项都包含以下 DWORD 值,用于表示自定义“安全”选项卡上的相应设置。
注意:除非另外声明,否则每个 DWORD 值等于 0、1 或 3。通常,设置为 0 则将具体操作设置为允许;设置为 1 则导致出现提示;设置为 3 则禁止执行具体操作。
-----------------------------------------------------------------------
1001 下载已签名的 ActiveX 控件
1004 下载未签名的 ActiveX 控件
1200 运行 ActiveX 控件和插件
1201 对没有标记为安全的 ActiveX 控件进行初始化和脚本运行
1206 允许 Internet Explorer Webbrowser 控件的脚本
1400 活动脚本
1402 Java 小程序脚本
1405 对标记为可安全执行脚本的 ActiveX 控件执行脚本
1406 通过域访问数据资源
1407 允许通过脚本进行粘贴操作
1601 提交非加密表单数据
1604 字体下载
1605 运行 Java
1606 持续使用用户数据
1607 跨域浏览子框架
1608 允许 META REFRESH *
1609 显示混合内容 *
1800 桌面项目的安装
1802 拖放或复制和粘贴文件
1803 文件下载
1804 在 IFRAME 中加载程序和文件
1805 在 Web 视图中加载程序和文件
1806 加载应用程序和不安全文件
1807 保留 **
1808 保留 **
1809 使用弹出窗口阻止程序 **
1A00 登录
1A02 允许持续使用存储在计算机上的 Cookie
1A03 允许使用每个会话的 Cookie(未存储)
1A04 没有证书或只有一个证书时不提示选择客户证书 *
1A05 允许持续使用第三方 Cookie *
1A06 允许使用第三方会话 Cookie *
1A10 隐私设置 *
1C00 Java 权限
1E05 软件频道权限
1F00 保留 **
2000 二进制和脚本行为
2001 运行已用 Authenticode 签名的 .NET 组件
2004 运行未用 Authenticode 签名的 .NET 组件
2100 基于内容打开文件,而不是基于文件扩展名 **
2101 在低特权 Web 内容区域中的网站可以导航到此区域 **
2102 允许由脚本初始化的窗口,没有大小和位置限制 **
2200 文件下载自动提示 **
2201 ActiveX 控件自动提示 **
2300 允许网页为活动内容使用受限制的协议 **
-----------------------------------------------------------------------
以上介绍完了IE安全选项的基本概念,接下说明如何利用脚本修改。
假设我们要修改浏览器的跨域浏览子框架(代号1607)为启用,它默认为禁用状态。
1、VBS篇
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg = GetObject("winmgmts:" &"{impersonationLevel=impersonate}\\"&strComputer _&"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\" & "Zones\3"
strEntryName = "1607"
dwvalue = 0
objReg.SetDWORDValue HKEY_CURRENT_USER, strKeyPath, strEntryName,dwValue
其中HKEY_CURRENT_USER指的是当前登录用户,此设置不会影响到其它登录的账号。strKeyPath为关键字的路径,根据之前关于Zones选项的解释,此路径不难看懂。strEntryName为需要设置的选项代号。dwvalue为需要设置的安全级别,此处0则代表允许。
2、BAT篇
REG add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v "1607" /t reg_dword /d 0x00000003 /f
posted @
2013-09-06 16:09 王海光 阅读(1106) |
评论 (0) |
编辑 收藏
针对该问题,微软有一个名为Certmgr.exe的证书管理器工具可以实现此目标,该工具主要用于管理证书、证书信任列表 (CTL) 和证书吊销列表 (CRL),
具体参数的示例请参考:
http://msdn.microsoft.com/zh-cn/library/e78byta0(VS.80).aspx。
该工具是SDK Tool的一部分,您可以下载最新的Windows SDK发行版获得此工具;若您安装了visual studio,该工具也包含在安装目录中。
为了更好的帮助您解决这一问题,我们可以通过下列步骤实现在客户端简易安装信任证书。
首先,您可以将根证书导出,并把这个证书保存到一个share folder里。
Export 成功之后,在客户端跑下面2个命令就可以把这个证书test.cer加到”trusted publishers”和”trusted root certification authorities”里了。
如果您的client端没有certmgr.exe,您可以把certmgr.exe放到一个sharefolder里,比如这里我把它放到当前目录下
1 “.\certmgr.exe” -add “.\test.cer” -s -r localMachine trustedpublisher
2 “.\certmgr.exe” -add “.\test.cer” -s -r localMachine AuthRoot
您可以把上面两行代码拷贝到一个bat文件中,客户只要双击这个bat文件即可完成安装证书,或者通过组策略来强制在域内的指定机器上运行这个bat 文件。
静默安装
利用vbs文件实现静默安装,脚本示例如下:
1 set ws=wscript.createobject("wscript.shell")
2 ws.run "installcert.bat /start",0
posted @
2013-09-06 15:56 王海光 阅读(11517) |
评论 (1) |
编辑 收藏
我们打开淘宝等网站时,IE浏览器会提示安装空间,这个控件便是用于对用户名密码进行加密的ActiveX控件。如何在我们的站点上安装如此控件,让用户可以通过简单的点击便可方便使用我们的空间呢?
下面是如何让在你的站点上安装控件的方法。
基础知识
html语言中Object标签
定义和用法
定义一个嵌入的对象。请使用此元素向您的 XHTML 页面添加多媒体。此元素允许您规定插入 HTML 文档中的对象的数据和参数,以及可用来显示和操作数据的代码。<object> 标签用于包含对象,比如图像、音频、视频、Java applets、ActiveX、PDF 以及 Flash。object 的初衷是取代 img 和 applet 元素。不过由于漏洞以及缺乏浏览器支持,这一点并未实现。浏览器的对象支持有赖于对象类型。不幸的是,主流浏览器都使用不同的代码来加载相同的对象类型。而幸运的是,object 对象提供了解决方案。如果未显示 object 元素,就会执行位于 <object> 和 </object> 之间的代码。通过这种方式,我们能够嵌套多个 object 元素(每个对应一个浏览器)。
实例
向HTML中添加对象:
1 <object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1"
2 width="100" height="50">
3 <param name="BorderStyle" value="1" />
4 <param name="MousePointer" value="0" />
5 <param name="Enabled" value="1" />
6 <param name="Min" value="0" />
7 <param name="Max" value="10" />
8 </object>
参考
http://www.w3school.com.cn/tags/tag_object.asp
Windows中注册类ID:clsid
“通用唯一标识符”(UUID),用于标识 COM 组件。每个 COM 组件在 Windows 注册表中都有自己的 CLSID,以便让其他应用程序加载。
ActiveX控件CLSID的获取
在编译完成每一个ActiveX控件之后,系统会生成ocx.html文件,其中是调用该ActiveX控件的方法。该页面中有一个标签即为Object,其中有一行则记录着该ocx文件的CLSID,如下:
1 <object
2 ID="TopoSceneViewer"
3 WIDTH=800
4 HEIGHT=600
5 CLASSID="CLSID:321B84C8-3745-4AC9-BF04-55753F40CE63">
6 </object>
创建cab文件
cab文件中需要包含一系列文件,其中.inf文件会告诉IE如何去安装这些文件。我们从.inf文件开始
怎么写inf
INF文件的组成有节(Sections),键(Key)和值(value)三部分。
关键节有
1 [Version]版本描述信息,主要用于版本控制。
2 [Strings]字符串信息,用于常量定义。
3 [DestinationDirs]定义系统路径信息。
4 [SourceDisksNames]指明源盘信息。
5 [SourceDisksNames]指明源盘文件名。
6 [DefaultInstall]开始执行安装。
其它的节可以自定义
最开始一般是[Version]区:
1 [Version]
2 signature="$XXXX$"
3 AdvancedINF=2.0
"Signature"项定义了该INF文件需要运行在何种操作系统版本中。有$Windows NT$, $Chicago$, or $Windows 95$三个值供选择,一般选择$Chicago$即可。
接下来就是最重要的[Add.Code]区:
1 [Add.Code]
2 Ctrl1.dll=C1Section
3 Ctrl2.dll=Ctrl2.dll
前面是要下载的文件名,后面是对应这个文件的区域名,可以是任何名字,不过一般都是和文件的名字相同,这样方便维护。
还有需要注意是在[Add.Code]区出现的文件要根据依赖性进行排序,例如前面说的ctrl1.dll要依赖于ctrl2.dll,则ctrl2.dll要出现在ctrl1.dll的前面。因为安装时是按照相反的顺序进行的,也就是说先安装ctrl2.dll,然后才是ctrl1.dll,哧哧,记清楚了,不要搞反了。
再接下来是各个文件的区域了
1 [Ctrl1.dll]
2 file-win32-x86=thiscab
3 RegisterServer=yes
4 clsid={..}
5 DestDir=
6 FileVersion=1,0,0,0
[Ctrl1.dll]区域中的第一个file值告诉ie到哪里去得到这个dll,file一共包括三个部分,第一部分是file,这个永远都是这样的(至少目前来说);第二部分告诉声明支持的OS,win32表示windows,mac就是苹果MAC OX了;第三部分是CPU类型,比如说x86、 ppc (Power PC)、 mips或者alpha了。
file的值可以取三个一个URL、ignore和thiscab,如果是URL则说明到URL所在的位置去下;如果是ignore说明对于这种OS和CPU,不需要下载这个文件(ctrl1.dll);如果是thiscab很明显就在当前的cab文件中了。
接下来是RegisterServer,可以取两个值yes和no,如果为yes则说明ie要注册该dll,如果是no就不必了。+如果这里选yes,则需要指定clsid,否则clsid一行可以省略。+
再下来是DestDir,它的值是dll将要存到本地硬盘的位置,如果它的值是10,则将dll放到/Windows或者/WinNT下;如果是11,则放到/Windows/System或者/WinNT/System32下;如果是空(就是没有值)则会放到/Windows或者/WinNT下的Downloaded Program Files目录下;
最后是FileVersion,这个就比较明显了,说明了ctrl1.dll的版本号。
其他部分详见参考文献。
创建cab文件
- 如果需要创建cab文件,首先需要Cabarc或者Makecab,它们随着Cabinet SDK的安装就有了,Cabinet SDK的下载地址是http://msdn.microsoft.com/workshop/management/cab/cabdl.asp
- Cabarc可以创建、查看或者解出cab里面的文件,而Makecab则只可以用来创建cab文件。
- 制作cab文件时需要将所有的相关文件都包含进去,可以通过Depends(VC自带的)检查需要的文件。使用inf文件将这些东西都写进去。
- inf搞法:inf文件描述cab中所有的ocx及dll文件,inf通过一些命名区域来提供需要的信息。
cabarc N ctrl1.cab ctrl1.inf ctrl1.dll
N表示要创建一个新的文件,ctrl1.cab是创建的文件名,ctrl1.inf是cab的inf,后而是需要加到cab里的文件,可以使用通配符。
然后就可以将cab文件放到网页上了
参考
- 如何编写INF:http://www.cnblogs.com/sbdx/archive/2006/12/14/whatisinffile.html
- 如何写cab相关的INF:http://docs.google.com/Doc?docid=0Aehzv88zbfy_ZGdncGdqczZfMjIxZHNnZDhtYzg&hl=zh_CN
签名
申请证书
要使用到makecert工具,在VS2005目录下搜索可以搜索到。
在命令提示行中执行
1 makecert -sk myNewKey -r -n "CN=发证机关的名字,OU=Certification,O=公司名字,E=name@email.com" -ss my myNew.cer
2 cert2spc myNew.cer myNew.spc
makecert具体使用帮助可参考创建证书的工具(makecert.exe)
签名
要使用到signtool工具,也可以在VS2005目录下找到。
signtool工具有多种使用模式,下面使用的是带UI的向导模式。
在命令提示行中执行
之后进入signcodewizard:
1 step1.选择要签名的cab文件
2 step2.自定义
3 step3.从文件中选择 myNew.spc
4 step4.csp中的私钥/密钥容器:myNewKey
5 step5.sha1
6 step6.next
7 step7.描述:插件名称/web:www.yourcompany.com
8 step8.http://timestamp.verisign.com/scripts/timstamp.dll
signtool 的具体使用帮助可参考签名工具 (SignTool.exe)
本文转自:http://blog.csdn.net/wangjingfei/article/details/5417028
其他链接:http://www.cnblogs.com/rushoooooo/archive/2011/06/22/2087542.html
posted @
2013-09-05 10:05 王海光 阅读(692) |
评论 (0) |
编辑 收藏
示例:
CRect rc = CRect(0,0,0,0);
m_staticTime.GetClientRect(&rc);
CDC* pDC = m_staticTime.GetDC();
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int nFontHeight = tm.tmHeight + tm.tmExternalLeading;
int nTopBottom = (rc.Height() - nFontHeight) / 2;
int nLeftRight = (rc.Width() - nFontHeight) / 2;
rc.DeflateRect(nLeftRight, nTopBottom);
m_staticTime.SetRectNP(&rc);
m_staticTime.SetWindowText("45");
ReleaseDC(pDC);
posted @
2013-09-04 16:14 王海光 阅读(2700) |
评论 (0) |
编辑 收藏
可以使用MUI函数里面的
MUI_FINISHPAGE_RUN_FUNCTION function
定义一个function,函数里面执行 安装完成后的exe
;定义安装界面
!define MUI_FINISHPAGE_RUN
;安装函数定义
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
!insertmacro MUI_PAGE_FINISH
;function要写字section之后
Function LaunchLink
ExecShell "" "$INSTDIR\*.exe"
FunctionEnd
posted @
2013-09-02 14:39 王海光 阅读(4591) |
评论 (0) |
编辑 收藏
问题产生: 使用gsoap时,如果WebService服务端及客户调用端都使用 C++ , 再传递中文时不会存在乱码问题, 当客户端为 C++ ,WebService服务端使用Java、domino,传递中文则会有乱码问题。
产生原因:
宽字符的原因
解决办法(一):
在程序中首先设置本地代码页
vista 操作系统:
setlocal(LC_ALL,"Chinese");
soap_set_mode(soap,SOAP_C_MBSTRING);
windowsxp 操作系统:
setlocal(LC_ALL,"chs");
soap_set_mode(soap,SOAP_C_MBSTRING);
解决方法(二)
1. 使用 wsdl2h.exe 通过wsdl描述文件创建C++头文件(test.h);
2. 将头文件(test.h)中 std:string* 使用wchar_t* 替换;
3. 使用 soapcpp2.exe -i test.h ,生成相关的cpp及h文件
4. 使用 C++ 时,需要将接收的wchar_t类型数据转换为char, 使用WideCharToMultiByte函数
后续:
soap在对字符编码转换时,调用 wctomb 函数,该函数的调用在 stdcoap2.cpp 文件中,代码调试跟踪至此,查看 该函数的返回值是否正确,-1表示字符集设置不正确。
本文转自:http://wenhaidongke.blog.163.com/blog/static/128070090200982313655668/
posted @
2013-08-29 19:57 王海光 阅读(2765) |
评论 (0) |
编辑 收藏
1.使用CTime类
CString str; //获取系统时间
CTime tm; tm=CTime::GetCurrentTime();
str=tm.Format("现在时间是%Y年%m月%d日 %X");
MessageBox(str,NULL,MB_OK); 2: 得到系统时间日期(使用GetLocalTime)
SYSTEMTIME st;
CString strDate,strTime;
GetLocalTime(&st);
strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);
strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond);
3.使用GetTickCount//获取程序运行时间
long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
Sleep(500); long t2=GetTickCount();//程序段结束后取得系统运行时间(ms)
str.Format("time:%dms",t2-t1);//前后之差即 程序运行时间
AfxMessageBox(str);//获取系统运行时间
long t=GetTickCount();
CString str,str1;
str1.Format("系统已运行 %d时",t/3600000);
str=str1; t%=3600000;
str1.Format("%d分",t/60000);
str+=str1; t%=60000;
str1.Format("%d秒",t/1000);
str+=str1; AfxMessageBox(str);
本文转自:http://www.cnblogs.com/bigbigtree/archive/2011/12/02/2272066.html
posted @
2013-08-22 17:36 王海光 阅读(1523) |
评论 (0) |
编辑 收藏
1、RichEdit文本转RTF文件
static DWORD CALLBACK MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;
pFile->Write(pbBuff, cb);
*pcb = cb;
return 0;
}
void CKTLXFunction::OnBnClickedIssuePaper()
{
// TODO: Add your control notification handler code here
CString sText;
m_richEdit.GetWindowText(sText);
if (sText.IsEmpty() && m_sImportPaperPath.IsEmpty())
{
AfxMessageBox("内容为空");
return;
}
CString sImportRtfPath = CCommonFun::GetExecutablePath() + "temp.rtf";
if (CFileFind().FindFile(sImportRtfPath))
{
::DeleteFile(sImportRtfPath);
}
CFile cFile(TEXT(sImportRtfPath), CFile::modeCreate|CFile::modeWrite);
EDITSTREAM es;
es.dwCookie = (DWORD) &cFile; //设置用例参数,以便回调函数调用
es.pfnCallback = MyStreamOutCallback;
m_richEdit.StreamOut(SF_RTF, es);
}
2、word文本转RTF文件
CString m_sImportRtfPath = CCommonFun::GetExecutablePath() + "temp.rtf"; if (CFileFind().FindFile(m_sImportRtfPath)) { ::DeleteFile(m_sImportRtfPath); } _Application WordApp; CoInitialize(NULL); if(!WordApp.CreateDispatch("Word.Application",NULL)) { LOG("创建Word服务失败!"); exit(1); return FALSE; } WordApp.SetVisible(FALSE); COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); Documents docs=WordApp.GetDocuments(); docs.Open(COleVariant("word文件路径"), vFalse, vFalse, vFalse, COleVariant(""), COleVariant(""), vFalse, COleVariant(""), COleVariant(""), COleVariant((short)0),COleVariant("UTF-8") ,vTrue, vFalse, COleVariant((short)0), vFalse, COleVariant("")); _Document active_doc; active_doc = WordApp.GetActiveDocument(); active_doc.SaveAs(COleVariant(m_sImportRtfPath), COleVariant((short)wdFormatRTF), vFalse, COleVariant(""),vFalse, COleVariant(""), vFalse, vTrue, vFalse, vFalse, vFalse,COleVariant("936"), vFalse, vFalse, COleVariant((short)0), vFalse); WordApp.Quit(vOpt, vOpt, vOpt); active_doc.ReleaseDispatch();
docs.ReleaseDispatch();
WordApp.ReleaseDispatch(); //释放对象指针。切记,必须调用
3、RTF文件转html文件 // 保存html文件 [8/12/2013 dell]
_Application WordApp;
CoInitialize(NULL);
if(!WordApp.CreateDispatch("Word.Application",NULL))
{
//AfxMessageBox("创建Word服务失败!");
exit(1);
return FALSE;
}
WordApp.SetVisible(FALSE);
COleVariant vTrue((
short)TRUE),vFalse((
short)FALSE),vOpt((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CString m_sImportRtfPath = CCommonFun::GetExecutablePath() + "temp.rtf";
if (!CFileFind().FindFile(m_sImportRtfPath))
{
LOG("转换html文件失败,没有找到rtf文件 : %s", m_sImportRtfPath);
return FALSE;
}
Documents docs=WordApp.GetDocuments();
docs.Open(COleVariant(
m_sImportRtfPath),
vFalse,vFalse,vFalse,COleVariant(""),COleVariant(""),
vFalse,COleVariant(""),COleVariant(""),
COleVariant((
short)0),COleVariant("UTF-8")
,vTrue,vFalse,COleVariant((
short)0),vFalse,
COleVariant(""));
_Document active_doc;
active_doc = WordApp.GetActiveDocument();
active_doc.SaveAs(COleVariant(
"保存html文件路径"),
COleVariant((
short)wdFormatHTML),
vFalse, COleVariant(""),vFalse, COleVariant(""),
vFalse,vTrue,vFalse,vFalse,vFalse,COleVariant("936"),
//COleVariant(L"UTF-8")
vFalse,vFalse,COleVariant((
short)0),vFalse);
WordApp.Quit(vOpt, vOpt, vOpt);
active_doc.ReleaseDispatch();
docs.ReleaseDispatch();
WordApp.ReleaseDispatch(); //释放对象指针。切记,必须调用
posted @
2013-08-21 08:53 王海光 阅读(2413) |
评论 (1) |
编辑 收藏
摘要: 一.常见问题 a.可以编译,不能执行的 AfxInitRichEdit(); b.升级默认的Riched版本(默认的有一些bug),如 可在InitInstance中添加 LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary 如果是CRichEditView基类的可用 BOOL ...
阅读全文
posted @
2013-08-21 08:42 王海光 阅读(14373) |
评论 (0) |
编辑 收藏