我一直使用VC6+ATL制作COM组件,有进程内形式的dll也有进程外形式的exe但在最终使用时,这些组件都必须和同名的.tlb文件放在一个目录下,客户端才能调用请问有什么办法将组件和它的tlb文件打包在一起,变成一个文件?有人说在组件的资源里加一句 IDR_TYPELIB1  typelib    "MyCOM.tlb"但我试了不行:(困扰很久的问题,感激涕零

解决方案 »

  1.   


    但我把组件的tlb文件删除后,客户端程序确实调用它失败呀:(
      

  2.   

    不需要,tlb是给脚本语言用的东西.
      

  3.   


    客户端也是用VC6写的
    调用代码如下void CClientDlg::OnButtonComStart() 
    {
    // TODO: Add your control notification handler code here 
    HRESULT hr = m_pExeCom.CreateInstance(_T("ExeTest.ExeCom.1")); //用ProgI的调用,用GUID调用也一样依赖tlb
    if (FAILED(hr))
    {
    return;
    }
    }如果组件没有和tlb文件放在一起, hr就会返回错误我是用ATL做的组件,是不是ATL做的组件都是这样, 还是有什么设置?
      

  4.   


    注册了, 只要组件和tlb放在一起, 可以完全正常的使用 
      

  5.   

    很奇怪,我都直接按照默认的选项来,就不需要,直接一个dll别人就可以用了.
      

  6.   

    tlb相当于头文件,只要你不import它,它就没用处.VC调用根本不用import这么一个文件.
      

  7.   

    当你以#import方式导入tlb时,需要有这个文件,然后生成对应的com对象类等来操作
    还有其他方式可以调用到com组件,如CoCreateInstance创建对应的对象..
      

  8.   

    当然需要com对象生成的.c,.h文件
      

  9.   


    在这一点上我没有异议现在的情况是在客户端和组件端两个程序都已经编译完成,且能够正常工作的情况下,只要删除了tlb文件,客户端的createInstance就返回失败
      

  10.   

    自己找到办法了因为我的组件都不是直接用ATL生成,而是通过给一般的MFC程序添加ATL支持做的,所以在Resource里不会自动添加 1   TYPELIB   "res\ExeTest.tlb"在IDE菜单里 View -> Resource Includes里加上这句就行了:)