一種方法:解決方法是在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 王海光 閱讀(674) |
評論 (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 王海光 閱讀(1186) |
評論 (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 王海光 閱讀(11701) |
評論 (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 王海光 閱讀(716) |
評論 (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 王海光 閱讀(2919) |
評論 (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 王海光 閱讀(4671) |
評論 (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 王海光 閱讀(2811) |
評論 (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 王海光 閱讀(1565) |
評論 (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 王海光 閱讀(2456) |
評論 (1) |
編輯 收藏
摘要: 一.常見問題 a.可以編譯,不能執行的 AfxInitRichEdit(); b.升級默認的Riched版本(默認的有一些bug),如 可在InitInstance中添加 LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary 如果是CRichEditView基類的可用 BOOL ...
閱讀全文
posted @
2013-08-21 08:42 王海光 閱讀(14585) |
評論 (0) |
編輯 收藏