RSS 2.0 Feed
集成开发环境(IDE)
摘要:在未安装Visual C++ 2005 的计算机上运行使用 Visual C++ 2005开发的应用程序,必须先安装Visual C++ 2005 运行时刻库组件。Visual C++ 2005 SP1更新了这个组件,所以使用Visual C++ 2005 SP1 开发的应用程序必须随程序发布Visual C++ 2005 SP1运行时刻库组件。但是Visual C++ 2005 SP1的一个BUG造成使用安装和部署项目进行部署的时候,安装程序可能安装原版的Visual C++ 2005 运行时刻库组件,而不是SP1版本,造成使用Visual C++ 2005 SP1 开发的应用程序启动失败。这个问题的原因是%Program Files%Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86下面的product.xml中的产品代码在安装Visual C++ 2005 SP1的过程中没有更新。要修正这个问题,可以打开这个文件,修改如下两行 <MsiProductCheck Property="VCRedistInstalled" Product="{A49F249F-0C91-497F-86DF-B2585E8E76B7}"/> 和 <BypassIf Property="VCRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3"/> 为 <MsiProductCheck Property="VCRedistInstalled" Product="{7299052b-02a4-4627-81f2-1818da5d550d}"/> 和 <BypassIf Property="VCRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="5"/> 另外,Visual C++ 2005 SP1版本的可以用最新的Visual C++ 2005 SP1运行时刻库组件来替换%Program Files%Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86下面的vcredist_x86.exe,这样安装和部署项目产生的安装程序中会包含最新版的组件。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ 集成开发环境(IDE) ]

摘要:使用过DLL的人都知道,重用二进制的代码很容易造成DLL地狱,这也是为什么Windows引入系统文件保护的原因之一。在Visual C++2005中引入的程序集清单(Assembly Manifest)看起来似乎可以解决这个问题,但是很多人发现在把Visual Studio更新到SP1后创建的安装程序项目不再能创建可以正常运行的安装程序。他们得到的是一个错误消息:应用程序配置错误,请重新安装应用程序。 看起来这个问题的原因是Windows Vista SDK和Visual Studio 2005 SP1的安装都把Visual C++2005运行时刻库(CRT)的合并模块安装到C:\Program Files\Common Files\Merge Modules下。Windows Vista平台SDK中的是CRT 8.0.50727.42,而Visual Studio 2005 SP1包含的是CRT 8.0.50727.752。如果安装完Visual Studio 2005 SP1之后再安装/修复Windows Vista SDK,那么C:\Program Files\Common Files\Merge Modules下会是Windows Vista SDK的旧版本,这会使得安装程序项目编译出有问题的部署包,因为应用程序使用的是新版本的CRT。 解决这个问题的方法是在安装/修复Windows Vista SDK之后重新安装Visual Studio 2005 SP1——你可能需要6.2G的系统盘剩余空间来完成这个安装。另外,为了保险起见,安装之后应该备份C:\Program Files\Common Files\Merge Modules下面的文件,至少也要把它们设为只读文件。...[阅读全文]

posted @ | Feedback (4) | Filed Under [ 集成开发环境(IDE) 平台SDK(Platform SDK) C++/CLI/Managed C++ Extension ]

摘要:月中MSDN第九频道对Visual C++项目组的两位产品经理进行了采访。摘要如下 很多面向中小企业的应用已经转向托管开发。但是C++的历史悠久,有太多代码积累仍旧是非托管的C++,而转向托管代码的话,C++程序员喜欢用工具支持更多的C#,所以Visual C++的焦点从托管支持转向非托管支持和托管/非托管互操作。 目前的目标包括对STL/CLR的支持和编译器级别的安全性(安全STL是类库级别的),以及辅助MFC基本类和托管代码互操作的模版。 LINQ这样的新技术不会在Orcas中支持,不过如果LINQ成为新的C++0x标准之一的话,当然也会被Visual C++支持。对C++标准的兼容性会加强以适应跨操作系统平台的应用程序。 一些80年代编译器的特性,例如编译期间节省内存、磁盘空间和CPU资源的做法在20年后已经不合时宜,编译器会升级以适应硬件的变化。比如对多核CPU的支持。 尽管Windows Vista开始推出了一些WPF这样的托管API,但是也增加了8000个外壳搜索扩展这样的非托管API。Visual C++的目标是让所有的Windows API在Visual C++中可用,甚至会有MFC或者ATL封装类。 希望我的听力没出大问题。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 集成开发环境(IDE) C++/CLI/Managed C++ Extension ]

摘要:同自动化浏览器(http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx)相比,自动化浏览器控件(WebBrowser Control) 在应用程序中更加常用。从Outlook的预览窗格到Maxthon这样的基于IE引擎的浏览器,从无界面的HTML分析器到Norton Antivirusd的主界面,浏览器控件在众多领域被用作各种各样的用途。这也使得有必要根据具体的用户需求自定义浏览器控件的行为。 在应用程序中加入浏览器控件 集成浏览器控件的最简单的方法是找一个支持ActiveX的集成开发环境,在工具箱中加入Microsoft Web Browser这个控件,往表单上拖一个这个控件就可以完成工作。你甚至可以用集成开发环境添加ActiveX的事件处理函数。如果要直接导入ActiveX的话,建议使用mehrcpp的vbMHWB控件(http://www.codeproject.com/atl/vbmhwb.asp)。这个控件在浏览器控件的基础上进行了扩展,暴露了很多底层接口。 通常导入ActiveX就可以满足大部分需求  ,但是有些类库中也集成了浏览器控件,并且提供了更多的功能,例如MFC的CHTMLView和CDHtmlDialog,ATL的HTML Control,以及.Net 2.0中的Windows.Forms.WebBrowser。如果使用Visual C++来进行非托管编程,那么建议使用MFC或者ATL的封装类,或者使用vbMHWB控件。托管编程中当然首选Windows.Forms.WebBrowser。除非这些类的BUG影响到了应用程序的开发,否则建议使用这些功能更加强大的封装类。 在使用浏览器控件及其封装类的时候要注意一些已知问题 最后一个包含浏览器的窗口关闭时会话信息可能会丢失(http://support.microsoft.com/kb/311072) MFC6.0版本的CHTMLView中一些方法没有释放获得的BSTR字符串,造成内存泄漏(http://support.microsoft.com/kb/241750)。 MFC6.0版本的CHTMLView缺少WS_CLIPCHILDREN风格,使得其中的浏览器控件重画不正常(http://support.microsoft.com/kb/220021) Windows.Forms.WebBrowser的WebBrowserSite类不能通过重载来自定义其行为(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115198) 常见任务 在集成浏览器控件之后,可以完成基本的网页浏览,但是对于不同的任务,也需要进一步的处理,例如设置控件的属性、为控件添加事件处理、操作HTML文档等等。 修改浏览器控件的属性 这在集成开发环境中可以很容易地设置,也可以自己实现容器来设置,但是CHTMLView这样的封装类没有这个选项(http://support.microsoft.com/kb/197921)。 链接目标解析。对于用浏览器控件来做浏览器的场合来说,需要将浏览器的RegisterAsBrowser属性设置为true。这使得Internet Explorer在解析HTML链接的target属性指定的目标窗口时可以找到这个窗口。 禁用拖放。对于使用浏览器控件来做预览窗格的场合来说,需要将浏览器的RegisterAsDropTarget属性设置为false。这使得窗口不接受拖进来的文件和链接。 禁用消息框。对于用浏览器控件来做HTML分析器的场合来说,有时需要屏蔽脚本产生的消息框以避免阻塞程序运行。这可以通过设置浏览器的Silent属性来实现,或者实现IDocHostShowUI::ShowMessage。 捕获浏览器控件的事件 集成开发环境中可以也很容易地添加浏览器的事件处理函数。比较常用的事件包括 NewWindow2或者NewWindow3事件。默认情况下,浏览器控件中创建的新窗口会是一个Internet Explorer的窗口。这通常不是预期的行为,对于浏览器程序来说更是这样。需要处理浏览器的NewWindow2或者NewWindow3(在Windows XP SP2或者Windows 2003 SP1之后可用)事件来让新的浏览器窗口在应用程序提供的窗口中运行。 WindowClosing事件。浏览器控件需要处理WindowClosing事件来在浏览器控件被脚本关闭时关闭浏览器控件的宿主窗口(http://support.microsoft.com/kb/253219)。 BeforeNavigate2事件。可以在自己的网页中加入自定义的协议,之后在BeforeNavigate2事件中扫描URL来进行网页和应用程序之间的交互(http://www.microsoft.com/msj/0100/c/c0100.aspx)。当然,自定义的网络协议也可以用Asynchronous Pluggable Protocol来处理(参见http://support.microsoft.com/kb/303740),vbMHWB控件就实现了这个功能。但是更加常用的是在弹出广告过滤器程序中用BeforeNavigate2来判断在NewWindow2事件中创建的窗口是否需要关闭。 操作MSHTML文档 通常HTML分析和浏览器自动化程序都需要分析网页的结构,找到需要操作的元素。这需要对网页的结构进行分析,找到目标元素的标识方法。 一些常用的操作包括: 设置HTML元素的属性,例如html、style、value等等。注意有些属性是只读的,甚至是程序无法访问的(例如input元素在类型为文件时其value属性不可访问)。 分析网页的结构来保存网页数据,例如拆取Web 页一文介绍的方案(http://www.microsoft.com/china/msdn/Archives/workshop/scrape.asp) 处理HTML元素的事件。这需要分析浏览器控件中的MSHTML文档对象,定位被操作的元素,以及在元素的连接点上挂接自定义的事件处理程序(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/tutorials/sink.asp)。 添加/删除HTML元素。注意设置有时设置outHtml属性并不能正确创建元素(http://support.microsoft.com/kb/185140),一个的方法是用HTMLDocument对象的CreateElememt方法。 调用HTML元素的方法,这和在脚本中操作HTML类似。可操作的元素/接口可以参考Interfaces and Scripting Objects(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/interface.asp),操作方法可以参考Introduction to Dynamic HTML(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/interface.asp) 以上的功能都可以通过直接在网页中加入脚本实现(http://support.microsoft.com/kb/185128),而且脚本也可以通过应用程序实现的扩展接口来和应用程序本身交互。另外,脚本还可以被用来自定义一些事件,例如在需要重载自定义的ShowModalDialog的时候就可以用IDispatchEx给window对象添加一个属性,其值为一个自定义的ShowModalDialog函数(http://groups.google.com/group/microsoft.public.inetsdk.programming.webbrowser_ctl/browse_thread/thread/e5eeb4a9111b16af/4bc2709aeb2bb444?lnk=raot),也可以用加入脚本的办法来捕获网页中的错误(http://support.microsoft.com/kb/317024)。  在页面包含框架的时候,可能需要跨框架访问HTML文档。可以通过查询框架元素所支持的IWebBrowser2接口或者IHTMLWindow2接口来访问框架中的文档(http://support.microsoft.com/kb/196340),但是也有可能因为安全设置而无法访问(http://support.microsoft.com/kb/167796)。 在浏览器控件中显示其它类型的文档时,可以用IWebBrowser2的document属性来访问ActiveX文档,例如在显示Microsoft Word时,IWebBrowser2的document属性就是Word的文档对象,在显示文件夹的时候,IWebBrowser2的document属性就是文件夹对象等等。 扩展浏览器的宿主 浏览器控件在创建时会查询ActiveX容器的IOleClientSite的实现的如下接口:IDocHostUIHandler, IDocHostUIHandler2 and IDocHostShowUI。 虽然在无法自定义ActiveX容器的情况下可以用ICustomDoc::SetUIHandler来挂接IDocHostUIHandler到浏览器控件,但是这样也会造成内存泄漏(http://support.microsoft.com/kb/893629)。一些类库,例如MFC、ATL和.Net类库都实现了IDocHostUIHandler接口。 除了专门用于浏览器用途的程序之外,通常都需要自定义浏览器控件的上下文菜单。这需要实现IDocHostUIHandler::ShowContextMenu。通常的实现包括完全禁用上下文菜单、完全替换上下文菜单、以及修改部分上下文菜单。经常被从上下文菜单中移除的菜单项包含查看源代码、刷新和属性。一种替代的方案是在容器中过滤右键消息(http://support.microsoft.com/kb/231578)。 与浏览器相比,一些Internet Explorer的宿主功能在浏览器控件中并不是默认启用。在某些场合,默认启用的宿主功能可能并非预期。这时需要实现IDocHostUIHandler::GetHostInfo。可以通过实现IDocHostUIHandler::GetHostInfo来自定义的功能包括: 自动完成功能。对于用浏览器控件来做浏览器的场合来说,这个功能是有必要启用的。启用的方法是设置DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE位 如果浏览器中的链接网址包含非ASCII的字符,那么需要实现IDocHostUIHandler::GetHostInfo,并且在返回的DOCHOSTUIINFO结构中设置dwFlags成员的DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8位。这使得网址会在发送之前用UTF-8编码。 3D边框、滚动条,禁用文字选择功能和禁用页面上的脚本。 对于使用浏览器控件来做HTML编辑器的场合来说,有时需要修改默认的页面样式。这都需要实现IDocHostUIHandler::GetHostInfo(http://support.microsoft.com/kb/328803)。注意在有些版本的IE中IDocHostUIHandler::GetHostInfo只在MSHTML被初始化的时候被调用,所以如果你需要在MSHTML被初始化之后使你的修改生效,你需要浏览到一个Word之类的非HTML Active document文档,之后再浏览回来。 在使用浏览器控件来做数据录入界面的场合,需要更改浏览器控件默认的Tab键处理使得用户可以使用Tab键切换到容器中的其他控件。这需要实现IDocHostUIHandler::TranslateAccelerator来自定义浏览器控件的快捷键处理。对于MFC这样用消息钩子来做消息预处理的可自定义容器来说,也可以用PreTranslateMessage来过滤F5键盘消息,而不是实现IDocHostUIHandler::TranslateAccelerator。 在脚本中调用应用程序对浏览器控件的扩展,这需要实现IDocHostUIHandler::GetExternal。使用.Net的WebBrowser控件的话设置ObjectForScripting属性就可以了。 对于用浏览器控件来做HTML分析器的场合来说,有时需要屏蔽脚本产生的消息框。这需要实现IDocHostShowUI::ShowMessage,或者设置浏览器的Silent属性。 另外,浏览器也会查询IOleClientSite来获得其它的服务信息,例如 IOleCommandTarget,查询控件的容器是否提供替代的命令处理,见拙作Hook DHTML Commands一文(http://blog.joycode.com/jiangsheng/archive/2005/07/09/58754.aspx) IServiceProvider。此接口被用于查询用户对如下接口的实现: IInternetSecurityManager ,用户可实现此接口来自定义浏览器控件的安全相关选项(http://msdn.microsoft.com/workshop/security/szone/overview/impl_secmanager.asp) IDownloadMamanger ,用户可实现此接口来自定义浏览器控件的下载过程 IAuthenticate,用户可实现此接口来自定义一些登录界面(http://support.microsoft.com/kb/329802) INewWindowManager,用户可实现此接口来重载Windows XP SP2和Windows 2003 SP1中新增的弹出窗口管理器的行为 其他控制 对于用浏览器控件来做HTML分析器的场合来说,有时需要禁用浏览器的脚本、ActiveX或者图片下载。这可以通过在容器中实现IDispatch,处理DISPID_AMBIENT_DLCONTROL来做到(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/overview/Overview.asp)。 看来离线浏览的控制并不能用这种方法来控制(http://support.microsoft.com/kb/247336)。不过你可以自己编写一个HTTP层传递 BINDF_OFFLINEOPERATION标志 (http://groups-beta.google.com/group/microsoft.public.inetsdk.programming.mshtml_hosting/msg/76bf4910a289d4b3) 在浏览器控件中java小程序可能不能正常运行,如果使用Sun JVM1.4之后的版本,可以用SetEnvironmentVariable 来设置JAVA_PLUGIN_WEBCONTROL_ENABLE为1来启用Sun JVM。 默认情况下在页面载入时会有点击声。屏蔽点击声的一个方法是在程序运行时修改注册表键(http://support.microsoft.com/kb/201901),另一个方法是将浏览器控件隐藏,在调用Navigate2之后再显示,但是这也需要锁定控件的更新区域(LockWindowUpdate)以避免闪烁。在IE7中,也可以调用 CoInternetSetFeatureEnabled函数,传递FEATURE_DISABLE_NAVIGATION_SOUNDS来禁用浏览时的声音。 在需要使用代理服务器时,有可能需要在应用程序中使用非默认的代理服务器设置。这可以通过调用UrlMkSetSessionOption来实现。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ .Net Framework HTML编程(IE Programming) 集成开发环境(IDE) 脚本(Scripting) 类库(Library) 平台SDK(Platform SDK) ]

摘要:尽管4月份还没到,一篇MSDN杂志4月号的文章已经出来了(http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy)。这篇文章描述了如何使用ManagedSpyLib库来访问其他进程内的托管控件及其属性和事件。尽管这个程序的主要目的是监视,但是也可以用ManagedSpyLib库来控制其他进程内的托管控件。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ .Net Framework 集成开发环境(IDE) 类库(Library) C++/CLI/Managed C++ Extension ]

摘要:好长时间没更新BLOG了,向大家拜个晚年先。最近没怎么写代码,转几篇在网易虚拟社区发的文章过来充数。 对于BUG的自信 Donald E. Knuth(高德纳)在TeX: The Program的前言中说:"我相信,在1985年11月27日,TeX代码里面的最后一个BUG已经被发现和解决了。但是,如果代码中仍旧有BUG,我很高兴付给任何第一个发现BUG的人20.48美元(这是前一个金额的两倍,而且我计划在一年内把它翻倍。你看,我很自信!)" 想知道后来发生了什么吗?在http://truetex.com/knuthchk.htm可以看到他写出去的支票的金额是从2.56美元开始翻倍的。微基百科中关于这种支票的文章(http://en.wikipedia.org/wiki/Knuth_reward_check)说,截至2001年10月为止,他写出去了超过两千张这样的支票,但是他的BUG支票是如此有名,以至于很多人把他的支票收藏起来而不是拿出去兑现(http://www.tug.org/whatis.html)。有多少程序员在发布产品的时候可以这样自信地声明产品没有问题? 遗憾的是,现在的程序员经常把发现BUG的责任推给测试人员——“不用担心,测试人员会发现所有BUG的,这是他们的工作”。实际上,测试人员并没有开发人员的条件,他们不可能进行源代码级别的调试,很大程度上只能靠运气——没错,是靠运气,如果一个BUG很容易被发现,程序员不太可能自己没有发现它——来发现BUG。 还有一些人干脆就认为BUG是不可避免的,或者认为不值得这么精益求精(参见网易虚拟社区http://p5.club.163.com/viewArticleByWWW.m?boardId=clanguage&articleId=clanguage_108eacc622169e7&boardOffset=0的讨论),但是实际上防止BUG出现的最好的时机,就是在编写代码的时候。在编写代码一段时间之后,即使是编写者本人也可能需要一段时间来理解代码(如果不习惯写注释的话,这段时间会更长),更别说定位问题所在了。在编写代码时,如果具有良好的习惯,可以免去很多在之后消灭BUG的困难。 规范不是语法 太多人把不要使用goto奉为圣旨,从来不想去打破。他们会争论,goto会造成难以维护的难读的代码,以及使编译器无法进行优化。这两点在很大程度上是真的,但是也有使用goto可以增加程序可读性和效率时候。在这种情况下,遵循“不使用goto语句”规范会产生更糟糕的代码。一些人喜欢在成员函数后面加const,但是另外一些人没有养成这个习惯。一个直接的结果就是,一些看起来对对象完全没有影响的函数不能在const函数里面使用。这时候应该怎么办?看看Paul DiLascia建议的,把this指针强行转化为一个非const指针(http://www.microsoft.com/msj/archive/S126E.aspx)。如果函数实际上会对对象成员造成影响(例如CToolBar::GetItemRect),这也会带来潜在危险。为了和ANSI标准之前编写的代码兼容,ANSI C中的memchr函数的声明为void *memchr( const void *buf, int c, size_t count ); 这里c是一个字符。很明显,标准为了兼容性放弃了明确性和更强的类型检查。如果放弃兼容性,这个函数应该声明为如下形式void *memchr( const void *buf, unsigned char c, size_t count ); 微软的很多代码使用一种叫做匈牙利表示法的命名规范。这使得标识符的含义和类型更加明确——但是这是从广义的角度来说的。考虑如下函数声明char *strcpy( char *strDestination, const char *strSource ); 如果严格遵循原始的匈牙利表示法,那么两个参数的声明应该是pch开头。但是以str开头给这两个参数更多含义:它们指向以\0为结束符的字符串。   规范是用来在大部分时间里遵循,以及在可以得到更好的结果时打破的。 编译警告的意义 智能化的编译器开始将语法正确的语句列为警告:while(size-->0);//注意这里有个分号 *pTo++=*pFrom++; 编译器会报告空循环问题。但是对于以0结尾的字符串复制while(*pTo++=*pFrom++); ,这样的警告是多余的。更加常见的警告是在条件判断语句中if(ch='\0') EndOfString(); 为了绕过这个警告,需要添加额外的运算或者语句,或者更正错误的赋值。while((*pTo++=*pFrom++)!='\0')...{} if(ch=='\0') 一些程序员甚至将比较语句修改成if('\0'==ch) 这样作的原因显而易见:为了减少潜在的BUG。如果你的编译器没有这样的警告,那么你可以使用一些工具来检查那些语法正确但是有潜在BUG的代码。LintProject (http://www.codeproject.com/tools/lintproject.asp)就是其中一个。但是,良好的编程习惯还是减少BUG出现的最好的方法。在觉得警告消息太烦人的时候,不妨想想编译器的开发人员为什么要编写这么多警告消息,而不是仅仅寻求关闭警告的方法。 P.S. Visual C++的默认警告等级是3级。发布软件之前应该改成4级,之后检查所有的编译警告。 无处不在的断言 使用编译器来捕获BUG的主意很好,Visual Studio 2005甚至会报告定义的变量不符合命名规范(Warning 1 CA1709 : Microsoft.Naming : Correct the casing of type name 'welcome'.);但是我敢打赌你检查BUG列表的时候,你会发现只有一小部分BUG会被编译器抓到。很多BUG在程序运行过程中很少会出现,例如内存分配失败的问题/**//// ///Use two bubble sort steps ///to show the performance information ///of different function calls. /// int main(array<System::String ^> ^args) ...{ bubbleSort<bubble1>(ARRAY_SIZE); bubbleSort<bubble2>(ARRAY_SIZE); return 0; } #pragma unmanaged /**//// ///testing unmanaged function... /// int foo() ...{ return 0; } 有空的话,多去微软的反馈中心提提对产品的建议是很有好处的…… 参考 /doc (Process Documentation Comments) (C/C++)( http://msdn2.microsoft.com/en-us/library/ms173501.aspx ) XML Comments for Managed C++ Applications (http://www.codeproject.com/dotnet/MCXDoc.asp) NDoc Code Documentation Generator for .NET(http://ndoc.sourceforge.net)...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 编译(CodeGen) 集成开发环境(IDE) 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:Quan To在其BLOG(http://blogs.msdn.com/quanto/archive/2005/10/25/485008.aspx) 中提到Visual Studio 2005 RTM已经定版,并且给出了卸载发布候选版本的方法。目前还不知道SQL Server 2005是否定版。尽管MSDN的订阅者并未像预期的那样在上周就看到VS2005的MSDN订阅下载,但是个人估计在正式发布日之前还是可以下载到的。  ...[阅读全文]

posted @ | Feedback (6) | Filed Under [ 集成开发环境(IDE) ]

摘要:个人觉得这次MVP峰会最大的进步就是技术相关的Session数量大大增加,按照MVP专长来分类;而不像上次那样按主题分类。我只需要在VC产品组的日程里面选择就可以了,而不是像上回那样不得不去听移动开发。当然这回也有MVP不去参加VC的Session,跑去听IE和移动开发。内容方面也比上次活泼很多,Don Box还是那么幽默,比尔·盖茨也有搞笑的演出,不过他看起来比去年七月份在北京的时候老多了。 一些可能有人会感兴趣的技术信息 新的产品开发合作网站http://connect.microsoft.com/。在这里可以申请参与新产品的测试。软件开发者可以使用Windows错误报告机制(Windows Error Reporting,简称WER,https://winqual.microsoft.com/parentorgs.asp)来获得反馈。 有人正在开发把VC项目转化成MSBuild的XML格式的工具 (http://blogs.msdn.com/clichten/archive/2005/06/07/Building_VC_projects_with_msbuild_and_not_using_vcbuild.aspx)。关于MSBuild的概述可以看看Christophe Nasarre的文章Overview of MSBuild (http://msdn.microsoft.com/library/en-us/dnlong/html/msbuildpart1.asp)和MSBuild Team Blog (http://blogs.msdn.com/msbuild)。还不知道这个工具是否支持VS.Net中其他语言的项目。新的代号为Phoenix的统一编译器平台也在计划中。可以加入插件来实现自定义语言的编译器 (http://blogs.msdn.com/kangsu/archive/2005/08/11/450481.aspx)。 在MFC8.0中使用Windows Forms会更加简单,加速键和Tab键的处理现在可以扔给MFC来做了 (http://blogs.msdn.com/yvesdolc/archive/2005/04/26/WindowsForms_In_MFC.aspx)。VC8.0中也会有一些新的向导,例如单元测试工程向导 (http://msdn.microsoft.com/library/en-us/dnvs05/html/vs05security.asp)。 一些建议 停止开发新的面向Win9x的程序和静态链接MFC的程序。使用新的MFC版本编译旧的程序来增加应用程序的安全性。 在新的程序中使用Unicode编码,同时尽可能将现有程序移植到Unicode。 移植到Visual C++ 2005来使用强大的编译器和调试器。 尽管限于保密协议我不能说得更多,但是微软在11月7号就会正式发布Visual Studio 2005、SQL Server 2005和BizTalk Server 2006了。新的Visual Studio版本(代号Orca和Hawaii)也正在规划中。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 用户界面 .Net Framework 集成开发环境(IDE) 类库(Library) 平台SDK(Platform SDK) 文档(Documentation) 语言(Language) ]

摘要:微软的桌面搜索API推出也有一段时间了,但是网上可以找到的相关技术资料还不多。官方的资料在http://addins.msn.com/devguide.aspx可以看到,而且网页上有SDK和一个C#的示例供下载。使用搜索API非常的简单,首先创建一个桌面搜索对象BOOL CWDSSampleView::PreCreateWindow(CREATESTRUCT& cs){ // TODO: Modify the Window class or styles here by modifying //  the CREATESTRUCT cs if(m_pSearchDesktop.CreateInstance(CLSID_SearchDesktop)) {  AfxMessageBox(IDS_FAILED_TO_CREATE_SEARCH_ENGINE);  return FALSE; } ……之后就可以开始执行搜索了。桌面搜索对象有两个方法,ExecuteSQLQuery和ExecuteQuery,都返回一个ADO记录集对象。ExecuteQuery是对用户比较友好的版本,参数虽然比较多,但是不需要自己构建SQL;而ExecuteSQLQuery是底层版本,只有一个参数——需要自己构造的SQL。相信我,你不会渴望自己来创建SQL的。传递给ExecuteQuery的参数就已经够长的了。字符串表中IDS_COLUMNS_GENERAL的内容是:DocTitle,DocFormat,Url,DocAuthor,PrimaryDate,FileName, FileExt,IsAttachment,Characterization,Rank,PerceivedType, HasAttach,DocTitlePrefix,FileExtDesc,DisplayFolder, DocKeywords,DocComments,ConversationID,Size, Create,Write。 void CWDSSampleView::Search(LPCTSTR lpszQuery,LPCTSTR lpszSort){ CString strQuery(lpszQuery);if(strQuery.IsEmpty())return; CString strSort(lpszSort); USES_CONVERSION; HRESULT hr=S_OK; GetListCtrl().SetItemCount(0); ClearCache(); try{  CString strColumns;  VERIFY(strColumns.LoadString(IDS_COLUMNS_GENERAL));  if(strSort.IsEmpty())   m_pRecordset=m_pSearchDesktop->ExecuteQuery(T2OLE(strQuery),    T2OLE(strColumns),NULL,NULL);  else   m_pRecordset=m_pSearchDesktop->ExecuteQuery(T2OLE(strQuery),    T2OLE(strColumns),T2OLE(strSort),NULL);  int nItemCount=m_pRecordset->GetRecordCount();  GetListCtrl().SetItemCount(nItemCount);   } catch(_com_error&e) {  …… }} 但是,访问返回的记录集的速度比访问数据库要慢。我不得不用虚列表和缓存来提高性能。在搜索结果很多(例如关键字选择"Microsoft")时程序有假死现象——当然也不排除我选择的字段过多的原因。 最近在写一个14位CPU的模拟器,CPU指令长度是固定的——13字节,十分的不吉利^_^b,而且CPU指令集中一些特定指令会根据上下文判断是否跳过下一个指令。但是在Intel系统上没有这样的指令,而且指令长度是可变的,所以无法知道下一个指令的长度来跳过它。我现在是在内存中设置一个标志,在执行每个指令之前检查这个标志来判断前一个指令是否指明跳过当前指令——低效,但是可以正常工作。 现在我知道一些模拟器为什么慢得像乌龟爬了……...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 随笔 用户界面 程序人生(Programming on the fly) 调试技巧(Debugging) 集成开发环境(IDE) 类库(Library) 平台SDK(Platform SDK) 数据访问(Data Access) 文档(Documentation) 组件开发(Component Development) ]

Full 集成开发环境(IDE) Archive