posts - 34,  comments - 5,  trackbacks - 0
 
原文:http://www.microsoft.com/china/net/developer/framework_com.asp

背景和历史

可复用软件不是一个新概念。八年来,人们一直在使用各种形式的组件对象模型(COM)。事实证明,它是最为成功的可复用软件模型。COM引进了“组件”的概念——它是可复用的代码块,可以将多个独立函数的功能进行组合,从而扩充成诸如Microsoft Word这样的应用程序。

大多数开发人员使用OLE时深刻体验了COM功能。OLE是基于COM形成的一组功能,使得用户能将一种文档嵌入到另一种文档中。这个功能本身似乎不太引人入胜,但它的作用却不同凡响:当用户将一个Excel文档粘贴到Word文档中后,单击嵌入的Excel文档时,OLE将会把Word的工具栏和菜单转换成Excel的工具栏和菜单。

从开发人员的角度看,COM通过引进几个明确定义的接口(诸如iUnknown)便可提供代码复用功能,开发期工具可通过这些接口来查询一个组件的功能,并能把这些功能添加到工具中。这就像Visual Basic®开发系统工具箱中的控件能够被拖到某个窗体中一样。实际上,每个控件都代表上百行甚至上千行的代码,可以容易地封装在“黑匣子”中,开发人员只需直接调用其功能即可。

开发人员在使用COM时感到不便的一个问题是,他们必须编写附加代码来将业务逻辑程序转换成可复用的组件,同时还必须实现许多接口才能进行这种转换。最重要的是,COM要求开发人员必须手动处理复杂问题,比如:清空不再使用的组件曾占用的内存、计算组件的使用次数、建立或撤消线程和进程以及处理版本控制问题等。

有人可能认为,让开发人员亲自执行这类工作的主意非常好,但这也有几个弊端。首先,要开发人员一一执行上述所有工作非常困难,往往容易出错:导致应用程序错误、系统崩溃以及可怕的“DLL Hell”。另外,严格地写出所有这种附加代码,会降低开发人员的工作效率,导致延期上市。

这对使用Visual C++®开发系统的开发人员来说,尤其如此。而对使用Visual Basic的开发人员来说,这种情况不是很严重。Visual Basic抽象并简化了COM的许多概念,是全世界最具生产力、最流行的开发环境,但它的局限性在于:为了实现这种高生产力而不得不向开发人员屏蔽了COM的一些功能。

微软在2000年的专业开发人员大会(PDC)上引进的.NET框架,能自动在软件编写过程中进行“智能拼接”,使得开发人员可以集中精力编写业务逻辑,而不必编写COM基本结构。

什么是.NET框架?

.NET框架是一个多语言组件开发和执行环境,它由以下三个主要部分组成:

  • 公共语言运行时。此名称不能准确反映它的全部功能。实际上,公共语言运行时在组件的开发及运行过程中,都扮演着非常重要的角色。在组件运行过程中,运行时负责管理内存分配、启动或删除线程和进程、实施安全性策略、同时满足当前组件对其它组件的需求。在开发阶段,运行时的作用有些变化:与现今的COM相比,运行时的自动化程度大为提高(比如可自动执行内存管理),因而开发人员的工作变得非常轻松。尤其是,映射功能将锐减开发人员将业务逻辑程序转化成可复用组件的代码编写量。对编程语言而言,运行时这个概念并不新奇:实际上每种编程语言都有自己的运行时。Visual Basic开发系统具有最为明显的运行时(名为VBRUN),Visual C++®跟Visual FoxPro®、Jscript®、SmallTalk、Perl、Python和Java一样有一个运行时,即MSVCRT。.NET框架的关键作用在于,它提供了一个跨编程语言的统一编程环境,这也是它能独树一帜的根本原因。

  • 统一的编程类。.NET框架为开发人员提供了一个统一、面向对象、层次化、可扩展的类库集(API)。现今,C++开发人员使用的是Microsoft基类库,Java开发人员使用的是Windows®基类库,而Visual Basic用户使用的又是Visual Basic API集。只是简单地一用,.NET框架就统一了微软当前的各种不同类框架。这样,开发人员无需学习多种框架就能顺利编程。远不止于此的是,通过创建跨编程语言的公共API集,.NET框架可实现跨语言继承性、错误处理功能和调试功能。实际上,从JScript到C++的所有编程语言,都是相互等同的,开发人员可以自由选择理想的编程语言。

  • 活动服务器页面(ASP+)。ASP+是使用.NET框架提供的编程类库构建而成的,它提供了Web应用程序模型,该模型由一组控件和一个基本结构组成。有了它,Web应用程序的构建变得非常容易。开发人员可以直接使用ASP+控件集,该控件集封装了公共的、用于超文本标识语言(HTML)用户界面的各种小器件(诸如文本框、下拉菜单等等)。实际上,这些控件运行在Web服务器上,它们将用户界面转换成HTML格式后再发送给浏览器。在服务器上,控件负责将面向对象的编程模型提供给Web开发人员,这种编程模型能提供面向对象编程技术的丰富功能。ASP+还提供一些基本结构服务(诸如会话状态管理和进程重启服务),这些服务大大减少了开发人员要编写的代码量,并使应用程序的可靠性得到大幅度提高。ASP+还允许开发人员将软件作为一项服务来提供。通过使用ASP+ Web服务功能,ASP+开发人员只需进行简单的业务逻辑编程,而由ASP+基本结构负责通过简单对象访问协议(SOAP)来提供服务。

COM的关系

.NET框架的一个主要目的是使COM开发变得更加容易。COM开发过程中最难的一件事是处理COM基本结构。因此,为了简化COM开发,.NET框架实际上已自动处理了所有在开发人员看来是与“COM”紧密相关的任务,包括引用计算、接口描述以及注册。

必须认识到,这并不意味着.NET框架组件不是COM组件。事实上,使用Visual Studio 6.0的COM开发人员可以调用.NET框架组件,并且在他们看来,后者更像是拥有iUnknown数据的COM组件。相反,使用Visual Studio.NET的.NET框架开发人员则将COM组件视作.NET框架组件。

为了避免引起误解,这里需对这种关系加以特别说明:COM开发人员必须手动去做大多数.NET框架开发人员可以在运行时自动执行的事情。例如,必须手写COM组件的安全性模块,且无法自动管理模块占用的内存,而在安装COM组件时,注册条目必须放进Windows注册表中。对.NET框架而言,运行时实现了这些功能的自动化。例如,组件本身是自我描述型的,因而无需注册到Windows注册表中便能安装。

COM+的关系

当把COM与Microsoft事务服务器(MTS)和分布式COM(DCOM)结合在一起时,就变成了COM+。COM+提供了一组面向中间层的服务。特别是COM+提供了进程管理功能和数据库与对象连接池处理功能。在将来的版本中,它还将提供一种称为分区的功能——专门为应用程序服务提供商设计的更强大的进程隔离功能。

COM+服务主要面向中间层应用程序开发,并主要为大型分布式应用程序提供可靠性和可扩展性。这些服务是对.NET框架所提供服务的补充;通过.NET框架类,可以直接访问这些服务。

posted @ 2007-09-10 12:25 披星戴月 阅读(261) | 评论 (0)编辑 收藏

BOOL CRoiDialog::ContinueModal()
{
      if(m_wndToolBar.IsWindowVisible())
      {
            CWnd* pWndParent = m_wndToolBar.GetParent();
            m_wndToolBar.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
      }

      return CDialog::ContinueModal();
}

posted @ 2007-09-10 12:22 披星戴月 阅读(559) | 评论 (0)编辑 收藏

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if (!CFrameWndBase::PreCreateWindow(cs))
  return FALSE;

 cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

 return TRUE;
}

BOOL CMainView::PreCreateWindow(CREATESTRUCT& cs)
{
 cs.style &=  ~WS_BORDER;
 return CFormView::PreCreateWindow(cs);
}

posted @ 2007-09-10 12:21 披星戴月 阅读(177) | 评论 (0)编辑 收藏

class CRecycleFile : private SHFILEOPSTRUCT
{
public:
      CRecycleFile()
      {
            memset((SHFILEOPSTRUCT*)this,0,sizeof(SHFILEOPSTRUCT));
            fFlags |= FOF_SILENT;                // don't report progress
            fFlags |= FOF_NOERRORUI;             // don't report errors
            fFlags |= FOF_NOCONFIRMATION;        // don't confirm delete
      }

      ~CRecycleFile() 
      {
      }

      //
      // Send a file to the recycle bin. Args:
      //  - full pathname of file.
      //  - bDelete: if TRUE, really delete file (no recycle bin)
      //
      int Recycle(LPCTSTR pszPath, BOOL bDelete=FALSE)
      {
            TCHAR buf[_MAX_PATH + 1]; // allow one more character
            _tcscpy(buf, pszPath);    // copy caller's path name
            buf[_tcslen(buf)+1]=0;    // need two NULLs at end

            // Set SHFILEOPSTRUCT params for delete operation
            wFunc = FO_DELETE;                   // REQUIRED: delete operation
            pFrom = buf;                         // REQUIRED: which file(s)
            pTo = NULL;                          // MUST be NULL
            if(bDelete) 
            {                       // if delete requested..
                  fFlags &= ~FOF_ALLOWUNDO;         // ..don't use Recycle Bin
            } 
            else 
            {                             // otherwise..
                  fFlags |= FOF_ALLOWUNDO;          // ..send to Recycle Bin
            }
            return SHFileOperation(this);        // do it!
      }

}

posted @ 2007-09-10 12:20 披星戴月 阅读(741) | 评论 (0)编辑 收藏
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" named_guids
using namespace Office;
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" named_guids rename("ExitWindows","WordExitWindows")
posted @ 2007-09-10 12:15 披星戴月 阅读(678) | 评论 (0)编辑 收藏
     摘要: .Net Reflector——.NET反编译工具软件
.Net Reflector is the class browser, explorer, analyzer and documentation viewer for .NET. Reflector allows to easily view, navigate, search, decompile and analyze .NET assemblies in C#, Visual Basic and IL.
Lutz Roeder's Net Reflector URL: http://www.aisto.com/roeder/dotnet/
  阅读全文
posted @ 2007-09-10 12:14 披星戴月 阅读(1454) | 评论 (0)编辑 收藏
象如下定义就得到一个数组的引用
        类型名 (&变量明)[N];
       
        实例
        int int_array[10];
        int (&int_ref)[10] = int_array;
        这样就得到了一个数组的应用

        在函数的声明中用数组的引用定义,就不怕数组退化了。如下
        for_each( int (&int_ref)[10] )
        {
                 for( int i=0; i<10; ++i )
                         std::cout << int_ref[i] << std::endl;
         }

         int main( int argc, char* argv[] )
         {
                 int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
        
                 for_each( int_array );
                 return 0;
          }

          在上面的代码中,如果你传入不是10个尺寸的数组,是编译通不过的。代码的安全性提高了。   

         想要定义一个数组引用类型,方法如下
         typedef 类型明 (&数组引用类型明)[N];

         实例
         typedef int (&Array_Ref)[10];
         Array_Ref就是一个数组的引用类型了。

posted @ 2007-09-10 12:09 披星戴月 阅读(285) | 评论 (0)编辑 收藏

1. 捕获WM_NCHITTEST:

    UINT CMyDialog::OnNcHitTest(CPoint point)
    {
         UINT nResult = CDialog::OnNcHitTest(point);
         return nResult  == HTCLIENT ? HTCAPTION : nResult;
    }

2. 捕获WM_LBUTTONDOWN:
         
    void CMyDialog::OnLButtonDown(CPoint point)
    {
          SendMessage(WM_SYSCOMMAND, 0xF012, 0);
          CDialog::OnLButtonDown(point);
    }

posted @ 2007-09-10 12:06 披星戴月 阅读(330) | 评论 (0)编辑 收藏
     摘要: TinyXml:
Homepage: http://www.grinninglizard.com/tinyxml/
Download:http://sourceforge.net/projects/tinyxml  阅读全文
posted @ 2007-09-06 12:22 披星戴月 阅读(695) | 评论 (0)编辑 收藏

1. tmail:

    -service: 调用类型,比如MMS,SMS,ActiveSync等

    -attach: 添加附件

    -subject: 添加subject

    -to: 添加目标地址

    举个例子:

    const szCMD[] = _T(" -service \"MMS\" -to \"test@sina.com;13800571505\"");

    CreateProcess(_T(\\Windows\\tmail.exe), szCMD, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL)

2. prun cprog.exe -url tel:121

 

posted @ 2007-06-21 13:41 披星戴月 阅读(1297) | 评论 (3)编辑 收藏
仅列出标题
共4页: 1 2 3 4 
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜