很奇怪,自己写的工程,调用的时候竟然在DllGetClassObject() 出错// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
printf("DllGetClassObject() \n");
HRESULT hr= _AtlModule.DllGetClassObject(rclsid, riid, ppv);
if(FAILED(hr))
printf("error in DLLGet \n");
return hr;
//    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}_AtlModule.DllGetClassObject(rclsid, riid, ppv)的时候竟然faile了!请求大侠帮忙!!  这些DLLGetClassObject等函数都是向导自动产生的啊详细的描述 请看:
http://topic.csdn.net/u/20080102/10/0fe7be90-ab8f-4493-aeba-27d4ac728ab8.html
大侠们一定帮忙看看 给点建议谢谢

解决方案 »

  1.   

    首先看hr的值,然后查找它的意义在ole viewer里看组件,是否注册好了
      

  2.   

    是的 没有注册
    连对象都没有得到成功啊 怎么可能能够注册啊不知道
    DllGetClassObject() 这个函数如果不通过ATL得 怎么可以实现呢?
    谢谢 
      

  3.   

    如果你想你的组件的DllGetClassObject被成功调用,你的组件必须已经注册成功。用regsvr32.exe your.dll注册后试试
      

  4.   

    注册表都已经注册了啊   注册表表项也都有了我的rgs文件:HKCR
    { NoRemove CLSID
    {
    ForceRemove {8E990322-6939-41b9-85D7-ABC0D2D656E5} = s 'sam_mpeg4_dmo class'
    {
    InprocServer32 = s '%MODULE%'
    {
    val ThreadingModel = s 'Both'
    }
     val MERIT=d '8392704'
    }
    }
    }
      

  5.   

    跟踪一下_AtlModule.DllGetClassObject的执行过程,看看是哪个步骤失败
      

  6.   

    执行到后面是调用 
     AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);而这个函数是微软封装好的
      

  7.   

    ATL的所有代码都是开源的,应该还能跟进去
      

  8.   

    ???  我好像跟不进去啊还有一个问题 如果没有注册成功的话,我运行根据这个DLL写的应用,能够调用这个DLL,但是就是在DLLgetclassObject 返回不成功后才挂的如果注册不成功的话,能够调用DLL??
      

  9.   

    如果没有注册,COM对象无法调用,但是DLL导出的4个函数还是能调用的。
    有可能你的代码中还有问题,导致COM无法取得你的库中的类厂接口
      

  10.   

    调试了 肯定是注册不成功但是不知道为什么DLLmain() 
    DMORegister() 
    DMORegister() 
    CertVerify: \Program Files\sam_mpeg4_dmo\mpeg4_dmo.dll trust = 2
    Failed to register, cleaning up!
    Deleting Key InprocServer32
    DLLmain() 
    不知道是为什么我的
    STDAPI DllRegisterServer(void)
    {
    // Register ourselves as a DMO with no types
    // RGS file also registers with a merit of 0 so DShow won't try to use us
    // Notes: register to DMOCATEGORY_VIDEO_EFFECT for testing.
    printf("DMORegister() \n");
    DMO_PARTIAL_MEDIATYPE mt[2],myout;
    mt[0].type    = MEDIATYPE_Video;
    mt[0].subtype = MEDIASUBTYPE_YV12;
    mt[1].type    = MEDIATYPE_Video;
    mt[1].subtype = MEDIASUBTYPE_I420; myout.type=MEDIATYPE_Video;
    myout.subtype=MEDIASUBTYPE_NULL;
    HRESULT hr=DMORegister(L"DMO mpeg4 video encoder", 
    CLSID_SAMmpeg4dmo, 
    DMOCATEGORY_VIDEO_ENCODER,
    0,
    2,
    &mt[0],
    1,
    &myout);
    printf("DMORegister() \n"); // registers object, typelib and all interfaces in typelib
        // registers object, typelib and all interfaces in typelib
       return _AtlModule.DllRegisterServer(FALSE);// return hr;
    }很可能这里就有问题  但是看上去是对的 很奇怪 不知道这个得和rgs文件有什么不一样