?? 6072.htm
字號(hào):
<HTML>
<HEAD>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<meta HTTP-EQUIV='Expires' CONTENT=0>
<link rel='stylesheet' href='../../../../news.css'>
<style type='text/css'>
.fst{padding:0px 15px;width:770px;background:#eeeecc;border-left:1px solid #000000;border-right:1px solid #000000}
.fstdiv3 img{border:0px;border-right:8px solid #eeeecc;border-top:6px solid #eeeecc}
</style>
<title>
Microsoft數(shù)據(jù)訪問組件的再發(fā)布
</title>
</HEAD>
<BODY aLink=#990000 bgColor=#ffffff bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 marginwidth=0 marginheight=0>
<center>
<TABLE align=center bgColor=#cccc99 border=0 cellPadding=2 cellSpacing=0 width=770>
<TBODY>
<TR>
<TH align=left >
Microsoft數(shù)據(jù)訪問組件的再發(fā)布
</TH>
</TD></TR>
</TBODY></TABLE>
<TABLE align=center bgColor=#eeeecc border=1 cellPadding=1 cellSpacing=0 width=770>
<TBODY>
<TR><TD colSpan=5 >
<a href='http://www.csdn.net'>中國軟件開發(fā)網(wǎng)絡(luò)</a>
-->
<a href='http://www.csdn.net/develop'>開發(fā)圖書館</a>
-->
<a href='http://www.csdn.net\develop\list_article.asp?lib=1&bigclassid=
1
'>
Visual C++
</a>
-->
<a href='http://www.csdn.net\develop\list_article.asp?lib=1&bigclassid=
1
&smallclassid=
107
'>
數(shù)據(jù)庫操作
</a>
-->
<a href='
http://www.csdn.net/develop/library/vc/datebase/6072.shtm
'>
Microsoft數(shù)據(jù)訪問組件的再發(fā)布
</a>
</TD></tr>
<TR>
<TD align=left width=300>
<B>關(guān)鍵字:</B><BR>
Microsoft數(shù)據(jù)訪問組件的再發(fā)布
</TD>
<TD align=middle width=120>
<B>貼文時(shí)間</B><br>
2001-3-31 16:08:06
</TD>
<TD align=middle width=80>
<B>文章類型: </B><BR>
轉(zhuǎn)貼
</TD>
<TD align=middle width=100>
<B>給貼子投票 </B>
<BR><a href='http://www.csdn.net/develop/addscore.asp?id=
6072
'>投票</a>
</TD></TR>
<TR>
<TD >
vcmfc
轉(zhuǎn)貼
</TD>
<TD colSpan=3 vAlign=top>
<B>出處: </B><A href='
http://www.zdnet.com.cn
'>
http://www.zdnet.com.cn
</A></TD></TR>
<TR><TD colSpan=5 bgcolor=#cccc99> </TD></TR>
</TD></TR></TBODY></TABLE>
<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<br><br><SPAN class=B1><B>Microsoft數(shù)據(jù)訪問組件的再發(fā)布</B></SPAN>
<P><SPAN class=a10>作者: Don Willits <BR>日期: 2000年06月27日 </SPAN>
<P><SPAN class=Text1><!-- storybody -->
<P><B>概要:</B>解釋了關(guān)于再發(fā)布MDAC組件的問題</P>
<P>主要討論:</P>
<UL>
<LI>定義Microsoft 通用數(shù)據(jù)訪問策略、數(shù)據(jù)訪問組件和數(shù)據(jù)訪問。
<LI>再發(fā)布MDAC (包括依賴關(guān)系和文件列表)。
<LI>與各種開發(fā)環(huán)境一起再發(fā)布。 </LI></UL>
<H2 class=b2a>簡(jiǎn)介</H2>
<P>Microsoft數(shù)據(jù)訪問組件(MDAC)現(xiàn)在正處于一個(gè)稱為“DLL地獄”的邊緣。這有兩個(gè)原因。首先,大量的應(yīng)用程序需要再發(fā)布一個(gè)或多個(gè)MDAC組件,其中包括開放數(shù)據(jù)庫連接(ODBC)、OLE DB、Microsoft ActiveX Data Objects (ADO)、和遠(yuǎn)程數(shù)據(jù)服務(wù)(Remote Data Service ,RDS)。其次,MDAC組件與其它可再發(fā)布的系統(tǒng)組件之間有著直接或間接的依賴關(guān)系。本文是關(guān)于最近版本的MDAC組件的再發(fā)布過程中可能遇到的問題的一個(gè)綜合性的概述。文中枚舉了在安裝或再發(fā)布MDAC組件時(shí)必須注意的問題。</P>
<P>就MDAC的再發(fā)布問題,已經(jīng)有一些Microsoft知識(shí)庫的文章。本文對(duì)這些文章只提供引用和上下文以幫助讀者決定是否需要進(jìn)一步了解細(xì)節(jié),而不是重復(fù)它們的內(nèi)容。</P>
<H1 class=b2a>Microsoft通用數(shù)據(jù)訪問策略,Microsoft數(shù)據(jù)訪問組件和數(shù)據(jù)訪問軟件開發(fā)工具包</H1>
<P>通用數(shù)據(jù)訪問是微軟公司為了對(duì)一個(gè)從桌面到企業(yè)系統(tǒng)的組織里的所有類型的信息(包括關(guān)系型的和非關(guān)系型的數(shù)據(jù))提供高性能的訪問而設(shè)計(jì)的數(shù)據(jù)訪問策略。它通過四個(gè)關(guān)鍵技術(shù)來完成這一點(diǎn):ODBC,OLE DB,ADO,和RDS。最近,聯(lián)機(jī)分析處理(OLAP)和多維擴(kuò)展又分別加入到了OLE DB (OLE DB for OLAP)和ADO(ADO MD)中。</P>
<P>ODBC是一個(gè)通過SQL查詢語法來在各個(gè)不同的數(shù)據(jù)源之間操縱關(guān)系型數(shù)據(jù)的國際標(biāo)準(zhǔn)。因?yàn)樗且粋€(gè)國際標(biāo)準(zhǔn),所以通過使用各種Microsoft或第三方提供的ODBC驅(qū)動(dòng)程序,你可以用它操縱許多種關(guān)系型數(shù)據(jù)源。ODBC最主要的缺點(diǎn)是它僅適用于基于SQL語法的關(guān)系型數(shù)據(jù)。</P>
<H1 class=b2a>MDAC 1.5</H1>
<P>到了MDAC 1.5,MDAC組件的安裝和再發(fā)布就比較協(xié)調(diào)了。MDAC 1.5 包括ODBC 3.5、OLE DB 1.5、ADO 1.5和RDS 1.5。RDS是高級(jí)數(shù)據(jù)連接器(Advanced Data Connector)的后繼者,但是改換了名稱,以表明它已經(jīng)越來越成為ADO的一個(gè)特性。到MDAC 2.0時(shí),關(guān)于RDS的文檔就和ADO放在同一路徑下。</P>
<P>再次地, MDAC 1.5 的各個(gè)部分包含在各種SDK和產(chǎn)品中。MDAC 1.5在Web上作為一個(gè)獨(dú)立安裝程序發(fā)布,同時(shí)作為Windows NT 4.0 Option Pack的一部分發(fā)布。MDAC 1.5的一些組件包含在Internet Explorer 4.x中,特別是RDS客戶端組件。Windows 98也包含MDAC 1.5 組件,同時(shí)包含MDAC 1.5組件的還有OLE DB 1.5 SDK和ODBC 3.5 SDK。</P>
<P>MDAC 1.5包含Microsoft Access/Microsoft Jet、SQL Server 的ODBC 驅(qū)動(dòng)程序,以及Oracle 的ODBC驅(qū)動(dòng)程序的重大更新版本。此外,可以從微軟公司得到兩個(gè)另外的OLE DB 提供商(雖然它們不包含在MDAC Stack中)。Microsoft Index Server的OLE DB提供商也可以單獨(dú)地從MDAC Stack得到。這些提供商都通過ODBC不支持的方式加強(qiáng)了OLE DB的功能,特別是利用非SQL查詢語法來通過OLE DB數(shù)據(jù)提供商從一個(gè)非關(guān)系型數(shù)據(jù)庫中取回?cái)?shù)據(jù)。</P>
<P>MDAC 1.5 曾經(jīng)有五個(gè)(或更多)單獨(dú)的版本,其中每個(gè)版本都有不同版本的ODBC 3.5、OLE DB 1.5、ADO 1.5和RDS 1.5組件以及 ODBC 驅(qū)動(dòng)程序和OLE DB 提供商。除了文件版本和對(duì)安裝程序修訂了一些Bug外,最開始的兩個(gè)版本沒有什么顯著差別。下面就是MDAC 1.5版本的概要情況:</P>
<UL type=disc>
<LI><B>Internet Explorer 4.0:</B>與Internet Explorer 4.0和Internet Client SDK 4.0一起分發(fā)。與兩個(gè)產(chǎn)品的安裝集成在一起。
<LI><B>MDAC 1.5</B>(<B>PDC):</B>更新了與Internet Exporer一起分發(fā)的組件。僅從1997 Professional Developers Conference CD的MDAC單獨(dú)安裝程序中可以得到。
<LI><B>MDAC 1.5a:</B>1997年10月6日到1997年11月20日期間可以從網(wǎng)上下載的單獨(dú)安裝的MDAC安裝程序中得到。
<LI><B>MDAC 1.5b:</B>可在Windows NT 4.0 Option Pack中得到,MDAC的獨(dú)立安裝實(shí)際上與Option Pack集成在一起(而不是作為一個(gè)單獨(dú)的安裝程序)。
<LI><B>MDAC 1.5c:</B>1997年11月20日后可以從網(wǎng)上下載,有兩種版本。一是MDAC的獨(dú)立安裝版本,另一個(gè)是小一些的MDAC再發(fā)布版本,它只安裝運(yùn)行期間組件。MDAC 1.5c 與包含在OLE DB 1.5和ODBC 3.5 SDK中的位測(cè)試匹配。在1.5b 和 1.5c版本之間修訂的bug有所增加,但是都很重要,主要是修訂ADO的線程問題和ODBC的連接池問題。
<LI><B>Windows 98 和/或 Internet Explorer 4.01 Service Pack 1:</B>MDAC的最后一個(gè)1.5d版本可以在Windows 98和Internet Explorer 4.01 Service Pack 1中找到。這兩個(gè)產(chǎn)品包含的MDAC組件都不完整,但是兩者都包含了唯一完整的最新ADO和RDS 1.5d組件。Windows 98 分發(fā)了一個(gè)MDAC前的Access ODBC Driver 子集,一個(gè)MDAC 1.5a OLE DB Provider for ODBC子集,以及ADO 1.5d 組件和RDS 1.5d組件。Internet Explorer 4.01 SP1 分發(fā)了 ODBC 3.0 (MDAC 1.0), MDAC 1.5前的 Access驅(qū)動(dòng)程序,一個(gè)MDAC 1.0 SQL Server ODBC Driver文件,一個(gè)MDAC 1.5a OLE DB Provider for ODBC子集,以及最新的ADO 和RDS 1.5d 組件。要從Windows 98 或 Internet Explorer 4.01 SP1得到一個(gè)最新1.5組件的最新全集,你必需首先安裝MDAC 1.5c,它將過時(shí)的ODBC組件和OLE DB組件更新。由于與這兩個(gè)產(chǎn)品一起分發(fā)的MDAC 1.5d版本與MDAC 2.0在時(shí)間上非常接近,所以MDAC 產(chǎn)品小組不再發(fā)布一個(gè)獨(dú)立或再發(fā)布版本的MDAC安裝程序。1.5d版本的重要改動(dòng)是移去了RDS的依賴關(guān)系,使得在腳本運(yùn)行和初始化時(shí)基于DCOM的事務(wù)對(duì)象更加安全。 </LI></UL>
<P>MDAC 1.5的再發(fā)布和依賴關(guān)系現(xiàn)在變得既簡(jiǎn)單又復(fù)雜。使用MDAC 1.5的獨(dú)立安裝程序可以很輕易地安裝整個(gè)MDAC 1.5,盡管安裝程序本身不是獨(dú)立于操作系統(tǒng)的: MDAC在Windows 95下的安裝程序不能在Windows NT下運(yùn)行,反之亦然。MDAC 1.5 還提供了一組豐富的特性來從命令行安裝特定的組件或驅(qū)動(dòng)程序/提供商。MDAC 1.5的再發(fā)布版本提供了一個(gè)操作系統(tǒng)無關(guān)的安裝程序,在Windows NT 3.51 和4.0以及 Windows 95上運(yùn)行得一樣好。欲了解使用MDAC 1.5再發(fā)布的詳細(xì)信息,請(qǐng)參看知識(shí)庫文章 Q181126 [INFO: Redistribution for MDAC 1.5 Components Available(MADC可用組件的再發(fā)布)]。</P>
<P>與MDAC的獨(dú)立安裝版本相比, MDAC 的再發(fā)布版本沒有那么多開發(fā)者想要的設(shè)置選項(xiàng)。但是,MDAC的獨(dú)立安裝版本并不總是提供開發(fā)者想要的東西:即使在通過命令行開關(guān)禁止它去檢測(cè)時(shí),MDAC 的獨(dú)立安裝程序都可以檢測(cè)到安裝一個(gè)特定組件需要些什么。有些理由可以解釋為什么不用MDAC的獨(dú)立安裝程序來在一個(gè)再發(fā)布場(chǎng)景下安裝MAAC組件。詳細(xì)信息請(qǐng)參閱知識(shí)庫文章Q177913 [Use the MDAC Stand-alone Setup EXE in Unattended Mode(使用無人照管模式的MDAC安裝程序)]。</P>
<P>你應(yīng)該使用MDAC再發(fā)布版本來在發(fā)布MDAC1.5。雖然MDAC獨(dú)立版本似乎在安裝特定組件時(shí)提供更多選項(xiàng),但是它是依賴于操作系統(tǒng)的,這樣就增加了你的再發(fā)布機(jī)制的大小和復(fù)雜性。也就是說,你不得不分發(fā)兩個(gè)6MB的文件,一個(gè)用于Windows NT ,一個(gè)用于Windows 95。此外,你的再發(fā)布機(jī)制必需能夠判斷當(dāng)前的操作系統(tǒng)類型,這樣你才能正確地使用適當(dāng)?shù)腗DAC獨(dú)立版本。</P>
<P>MDAC獨(dú)立安裝程序?qū)嶋H上包含了半個(gè)SDK,它們?yōu)镸DAC 1.5提供SDK組件。然而,另外兩個(gè)SDK——ODBC 3.5 SDK (發(fā)布于1998年春天)和OLE DB 1.5 SDK (發(fā)布于1997秋天)—是MDAC 安裝的補(bǔ)充。如果你運(yùn)行所有三個(gè)安裝程序,你將得到一個(gè)完整的范例、文檔、頭文件和庫文件集合。這就是為什么創(chuàng)建Data Access SDK的原因:開發(fā)者僅僅需要執(zhí)行一個(gè)安裝程序就可以獲得MDAC 2.0的所有SDK。</P>
<P>MDAC 1.5對(duì)一個(gè)OLE Automation 補(bǔ)丁有依賴關(guān)系,特別是在老版本的Windows 95上運(yùn)行時(shí)。(欲了解如何獲得這個(gè)補(bǔ)丁的信息,請(qǐng)參看知識(shí)庫文章Q164529 [FILE: Updated Automation System Files])。進(jìn)一步地,MDAC 1.5獨(dú)立版本對(duì)一個(gè)從Internet Explorer 3.02(或后來的版本)中或單獨(dú)發(fā)布補(bǔ)丁中得到的更新Comctl32.dll文件有依賴關(guān)系。(欲了解如何獲得這個(gè)Comctl32.dll 補(bǔ)丁,請(qǐng)參看知識(shí)庫文章Q165487 [Incorrect or Garbled Text on Tab Labels in Properties])。如果沒有這個(gè)更新Comctl32.dll文件,MDAC獨(dú)立版本的安裝對(duì)話框的寬度將會(huì)是顯示器寬度的20倍(欲了解此信息,請(qǐng)參看知識(shí)庫文章Q183092 [PRB: MDAC Stand-alone Setup Dialog Overly Large on Windows 95])。如果你把對(duì)話框拖到最左邊然后點(diǎn)擊<B>Next</B>,則安裝程序?qū)?huì)停止。MDAC的再發(fā)布版本則沒有這個(gè)問題。即使沒有這個(gè)DLL文件,安裝也能正常運(yùn)行。</P>
<P>在發(fā)行MDAC 1.5是并不知道這些依賴關(guān)系。通用數(shù)據(jù)訪問Web頁錯(cuò)誤地說,你必須在安裝MDAC 1.5前安裝Internet Explorer 4.0。實(shí)際上,Internet Explorer 4.0碰巧安裝了Automation補(bǔ)丁和Comctl32.dll補(bǔ)丁;但是你可以用前文提高的文章介紹的方法分別地、獨(dú)立地獲得這兩個(gè)補(bǔ)丁。你不需要Internet Explorer 4.0來開發(fā)和再發(fā)布基于MDAC 1.5的應(yīng)用程序。</P>
<P>唯一實(shí)際與Internet Explorer 4.0有依賴關(guān)系的是RDS,特別是當(dāng)你的RDS客戶端應(yīng)用程序是基于Web的程序時(shí)。否則的話,你就可以在不安裝Internet Explorer 4.0的機(jī)器上開發(fā)你的MDAC 1.5 應(yīng)用程序了。再發(fā)布一個(gè)RDS客戶端應(yīng)用程序需要一套必要的DLL,而不管你的客戶端是否基于Visual Basic。欲了解詳細(xì)信息,請(qǐng)參看知識(shí)庫文章Q176874 [HOWTO: Distributing RDS Client with Visual Basic Setup Wizard]。</P>
<P>到MDAC 1.5時(shí),在ODBC 3.5和OLE DB Provider for ODBC Drivers之間的依賴關(guān)系更為明顯。OLE DB Provider for ODBC Version 1.1根據(jù)ODBC 3.0的特定Unicode規(guī)范編寫。由于這些規(guī)范到ODBC 3.5時(shí)發(fā)生了變化,所以在再發(fā)布一個(gè)基于ODBC 3.5的應(yīng)用程序時(shí),你必需使用OLE DB Provider for ODBC version 1.5。否則,你的軟件的安裝就會(huì)有破壞顧客機(jī)器上現(xiàn)存的基于OLE DB和ADO的應(yīng)用程序的危險(xiǎn)。這個(gè)依賴關(guān)系在知識(shí)庫文章Q178852 [INFO: OLE DB Provider for ODBC Now an ODBC 3.5 Core Component] 和Q178843 [FILE: Required Files to Redistribute ODBC Version 3.5] 中有記載。</P>
<P>在開發(fā)者中常常造成混亂的一個(gè)問題是再發(fā)布一個(gè)RDS客戶端程序的最小需求。如果你的RDS 1.5實(shí)在是基于Web的,那么是的,你需要Internet Explorer 4.0(如果你使你的Web客戶端使用RDS 1.1,則你可以使用Internet Explorer 3.02)。如果你的客戶端程序不是基于Web的,那么你無須安裝Internet Explorer。欲了解安裝RDS客戶端組件的最低需求,請(qǐng)參看知識(shí)庫文章Q176874 [HOWTO: Distributing RDS Client with Visual Basic Setup Wizard]。(文章是針對(duì)在Visual Basic 安裝向?qū)Лh(huán)境的,但是這個(gè)需求對(duì)其它情形下的同樣適用)。</P>
<P>與所有MDAC 1.5的五個(gè)版本一起分發(fā)的Msadc11.cab文件沒有適當(dāng)?shù)乩梦募陌姹拘畔?,特別是它不能正確地更新和覆蓋一個(gè)安裝了ADC 1.0組件的系統(tǒng)。因此,有舊的RDS客戶端組件的客戶端不會(huì)從Msadc11.cab文件下載更新的組件。ClsidView范例闡述了這個(gè)問題。但是,產(chǎn)品小組最近發(fā)行了一個(gè)更新后的Msadc11.cab文件,它糾正了MDAC 1.5 和 MDAC 2.0里的這些錯(cuò)誤(請(qǐng)參看See 知識(shí)庫文章Q185963 [FIX:Updated RDS Msadc11.cab for Internet Explorer Download PRB],上面有關(guān)于此問題的討論和如何獲得更新后的Msadc11.cab文件)。對(duì)RDS 1.5組件沒有RDS .cab文件。安裝它們的唯一方法是用Internet Explorer 4.01、MDAC 獨(dú)立安裝程序或MDAC再發(fā)布來安裝。</P>
<P>MDAC 1.5 再發(fā)布非常有用,但有時(shí)安裝MDAC 1.5組件的.cab文件更好用。要了解圍繞MDAC 1.5 再發(fā)布的.cab文件的創(chuàng)建問題,請(qǐng)參看知識(shí)庫文章Q185622 (HOWTO: Adding the MDAC Redistribution Setup to CAB Files)。</P>
<P>許多開發(fā)者想控制再發(fā)布的大小。MDAC 1.5再發(fā)布組件的大小不在于ADO、RDS、或OLE DB組件,而在于ODBC或不同的ODBC驅(qū)動(dòng)程序。Access驅(qū)動(dòng)程序本身的大小為約2 MB。這就是為什么MDAC再發(fā)布有兩種方式,Mdacrdst.exe 和 Mdacfull.exe。Mdacrdst (1.7 MB)包含ODBC 3.5、 OLE DB Provider for ODBC Drivers、ADO 1.5、RDS 1.5和SQL Server ODBC Driver。Mdacfull (nearly 4 MB)有包含在Mdacrdst中的所有組件,此外加上Oracle和Microsoft Access/Microsoft Jet ODBC驅(qū)動(dòng)程序。</P>
<P>Windows 98 和Internet Explorer 4.01 確實(shí)包含MDAC 1.5d的組件。但是,它們包含的ODBC和OLE DB版本是不完全的,并且比那些MDAC 1.5c中的版本要老。為了保證你得到最新的版本,請(qǐng)應(yīng)用Windows 98 或Internet Explorer 4.01 Service Pack 1,然后安裝MDAC 1.5c。對(duì)MDAC 1.5d的改動(dòng)僅僅是加入了新的特性;它們僅僅在你使用遠(yuǎn)程數(shù)據(jù)服務(wù)和用DCOM協(xié)議部署它時(shí)是有用的。</P>
<P>ODBC 3.5 在Windows NT 3.51、4.0 和 Windows 95上測(cè)試并為這些平臺(tái)所支持。OLE DB 1.5、ADO 1.5和RDS 1.5 在Windows NT 4.0和Windows 95上測(cè)試并支持。然而,再次地,依賴關(guān)系使它們不能在Windows NT 3.51上測(cè)試和支持。</P>
<P><B>表2. MDAC 1.5組件的文件路徑和分布</B></P>
<P>SYS\…<驅(qū)動(dòng)器名>:\<Windir>\<Systemdir> </P>
<P>OLE\…<驅(qū)動(dòng)器名>:\Program Files\Common Files\System\Oledb</P>
<P>ADO\…<驅(qū)動(dòng)器名>:\Program Files\Common Files\System\Ado</P>
<P>RDS\…<驅(qū)動(dòng)器名>:\Program Files\Common Files\System\Msadc</P>
<TABLE border=1 cellPadding=0 cellSpacing=0>
<TBODY>
<TR>
<TD colSpan=14 vAlign=top width=865>
<P><B>ODBC 驅(qū)動(dòng)程序管理器 </B></P></TD></TR>
<TR>
<TD vAlign=top width=141>
<P><B>路徑和文件名</B></P></TD>
<TD vAlign=top width=94>
<P><B><BR>IE 4.0</B></P></TD>
<TD colSpan=2 vAlign=top width=112>
<P><B><BR>MDAC 1.5</B></P></TD>
<TD colSpan=2 vAlign=top width=103>
<P><B><BR>MDAC 1.5a</B></P></TD>
<TD colSpan=2 vAlign=top width=108>
<P><B><BR>MDAC 1.5b</B></P></TD>
<TD colSpan=2 vAlign=top width=103>
<P><B><BR>MDAC 1.5c</B></P></TD>
<TD colSpan=2 vAlign=top width=85>
<P><B>IE 4.01<BR>SP1</B></P></TD>
<TD colSpan=2 vAlign=top width=119>
<P><B>Windows 98</B></P></TD></TR>
<TR>
<TD vAlign=top width=141>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -