none
单步调试com时遇到了自相矛盾的问题 RRS feed

  • 问题

  • 各位好,
    最近接触com组件,写了一个进程内的DLL,并建了一个win32控制台程序来测试,直接运行测试程序,输出结果正常。但是进行单步调试的时候,进入以下语句却发生了著名的“0x80040154 没有注册类”的错误。 com组件肯定是注册了的,否则直接运行也不会输出正常结果。

    hr=spFoo.CreateInstance(__uuidof(Foo));

    将这行代码改为:
    hr=spFoo.CreateInstance(__uuidof(Foo),NULL,CLSCTX_INPROC_SERVER);

    这次错误代码变成了“-2142286779”。

    取消调试,直接运行测试程序,结果依然正常。

    这是什么问题啊?

    我使用的是Visual Studio 2010 beta2


    2010年3月5日 3:18

答案

  • 这不是没有定义的错误,你该把hr定义为HRESULT而不是int,
    这样你就可以看到hr = 0x804f4c45
    这个错误你可以参考以下文章,关闭COM Debug Cross


    http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/345004112041

    0xBAADF00D
    • 已标记为答案 ThinkBox 2010年3月6日 9:43
    2010年3月5日 14:30
    版主
  • 多谢Vonger的答复!

    "hr=-2142286779"转换为dword的确是0x804f4c45,不过这是系统返回的HRESULT值,我并没有把它强制转换为int类型啊。
    受此启发,我换了一种调试方式,发现错误是我的com组件内部包容的一个com组件在创建时返回的错误。

    “COM Debug Cross”是Delphi dubugger选项,Visual Studio中应该禁止"Enable RPC debugging"。 这样一来,调试时发生的这个错误就消失了。
    • 已标记为答案 ThinkBox 2010年3月6日 9:43
    2010年3月6日 3:45

全部回复

  • 改用COM库API CoCreateInstance
    spFoo是COM工厂用来创建COM实例用的。
    CoCreateInstance将会根据注册内容首先找到Dll,然后创建COM Factory。Factory再根据你的CLSID创建COM对象。


    麻烦把正确答案设为解答。
    2010年3月5日 4:06
    版主
  • 感谢版主回复。

    好像不是这个原因,我把代码改为: hr=::CoCreateInstance(CLSID_Foo,NULL,CLSCTX_INPROC_SERVER,IID_IFoo,(LPVOID*)&pFoo);

    结果是单步调试到这行代码后,hr=-2142286779(一个没有定义的错误代码)。 但直接运行而不调试测试程序,结果却是正常的。
    2010年3月5日 8:18
  • 这不是没有定义的错误,你该把hr定义为HRESULT而不是int,
    这样你就可以看到hr = 0x804f4c45
    这个错误你可以参考以下文章,关闭COM Debug Cross


    http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/345004112041

    0xBAADF00D
    • 已标记为答案 ThinkBox 2010年3月6日 9:43
    2010年3月5日 14:30
    版主
  • 多谢Vonger的答复!

    "hr=-2142286779"转换为dword的确是0x804f4c45,不过这是系统返回的HRESULT值,我并没有把它强制转换为int类型啊。
    受此启发,我换了一种调试方式,发现错误是我的com组件内部包容的一个com组件在创建时返回的错误。

    “COM Debug Cross”是Delphi dubugger选项,Visual Studio中应该禁止"Enable RPC debugging"。 这样一来,调试时发生的这个错误就消失了。
    • 已标记为答案 ThinkBox 2010年3月6日 9:43
    2010年3月6日 3:45