看了 《com技术内幕》 理论是有了点,但却不知道如何下手自己写一个书上的前面几章例子是由dll实现的,我想用dll写一个简单的com,我用的是vs2005可是,我应该建立一个什么项目呢?我现在建了一个MFC DLL。不过它自己生成的时候里面就已经存在了一个类,如下:BEGIN_MESSAGE_MAP(CfirstComApp, CWinApp)
END_MESSAGE_MAP()
// CfirstComApp 构造CfirstComApp::CfirstComApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CfirstComApp 对象CfirstComApp theApp;
// CfirstComApp 初始化BOOL CfirstComApp::InitInstance()
{
CWinApp::InitInstance(); return TRUE;
}我不知道这个是干什么用的到底应该创建一个什么项目呢?这个MFC DLL又是干什么用的啊,里面的自动生成的东西又是干什么用的啊?是因为我的书太老了吧,很东西好像都不一样了,不能按书的步骤来了。很迷糊啊`~~

解决方案 »

  1.   

    你连APP类都不知道干什么的,你还写了一个COM的实例,你更不会明白,先弄MFC的机制吧。
      

  2.   

    app就是应用程序类嘛,这个我知道,不过它写在dll里干什么呢?我书上新建的dll都是空白的
      

  3.   

    不过vs2005里面好像只有mfc dll啊
      

  4.   

    你参考一下msdn的一篇教程啊,是写atl的控件吗?
      

  5.   

    这是一个教程的网址,我照着做过,可以实现vb底下调用该控件的 http://blog.donews.com/crazyworm/archive/2004/12/16/204221.aspx
      

  6.   

    开发com使用atl才是正道,建议看看《atl internals》
      

  7.   


    创建ATL Project。MFC DLL不一定就是COM或者干脆就win32 project吧。
      

  8.   

    哎 其实直接使用C++编写一个普通的DLL
    在这个DLL中你导出DllGetClassObject
    DllCanUnloadNow,DllRegister,DllUnRegister函数就可以了呀
    然后你在运行进入cmd,然后使用rgsvr32 xxx.dll就可以在组册表中写入组件的信息了
    通过调用CoCreateInstance函数传递进你的组件CLSID就可以使用这个组件了。
      

  9.   

    借助MFC或者ATL可以免去你编写往注册表写如信息的代码和
    编写那几个几乎是一成不边的导出函数。
      

  10.   

    如果你修为高到一定程度后你使用IDL也可以在一定程度上
    直接处理了接口的定义和组件的定义问题。
      

  11.   

    谢谢,大家atl不是创建activeX用的吗?
    也可以开发普通的COM组件吗?
      

  12.   

    ATL是个模板库,activeX也是COM组件的一种
    可以使用它来编写普通的COM组件的,其实使用COM的人只关心组件的
    接口,对于组件的实现的任何细节都无须关心。但组件的编写人员必须提供
    详细的接口文档,否则使用组件的人员没有相关文档即使拿到组件也没用,
      

  13.   

    唉,现在出书的通病,一上来就是 inside internal的大部头,想当年偶也是还不知道COM怎么用就先把原理研究了一溜够,恨不得自己都觉得能用汇编码个COM了还不知道怎么自动化,就没人学老外出几本cookbook的,大概是东西太少写不了多厚不咋滴赚钱吧 吼吼进VC,生成ATL项目,不管那么多先默认了吧,记得把支持com1.0和注册选上,然后,添加类(选择简单ATL对象),程序会自动生成一个接口类和实现这个接口的实体类,如果要添加方法,在接口上右击(实体类里面会多相应的函数代码),如果要添内部函数,在实体类上右击。编译完了也就自动注册了怎么用?只说VC的
    建立一个新项目,include完了后写
    #import "刚才生成的dll的地址" no_namespace
    先编译下,在生成目录里面去找一个.tlh的文件,声明全在里面,下面有用
    然后在函数中(只讲智能指针的)
    {
        ::CoInitialize(NULL);
        try{
            I接口名Ptr = p随便起(__uuidof(实体类名));在tlh中找,一定要一致
             p随便起->方法();
        }
        catch(_com_error e){
            ……
        }
        ::CoUninitialize();
    }记得try catch一定要有如果真的是超级新手的话,建议一上来先把上面这个玩转了再说吧,比生成和使用dll还方便。
    等需要研究远调和同步什么什么的的时候在看大部头不迟。
    个人观点,COM这玩意弄出来是服务于俺们的不是折磨俺们的。