小编mor*_*nlf的帖子

COM注册失败,错误代码为0xC0000005

我正在开发一个包含多个C++ COM Dll的遗留项目.每次在调试配置上构建解决方案时,构建过程都会为每个COM项目提供错误:

Error   10  error MSB3073: The command "
        regsvr32 /s /c "D:\*****removed intentionally****_d.dll"
        echo regsvr32 exec. time > ".\Debug\regsvr32.trg"
        echo Server registration done!
      :VCEnd
    " exited with code -1073741819. 
Run Code Online (Sandbox Code Playgroud)

我最近加入了这个项目,所以当我询问它时,我被告知每个人都会忽略这些错误,因为解决方案在第二个版本上成功构建.

我决定深入挖掘,似乎COM注册本身成功(这解释了为什么第二个版本没有重新尝试注册),但是对regsvr32的调用会返回错误代码(0xC0000005).这就是构建失败的原因.

我还试图从自定义构建步骤中删除注册,而是选择从链接器属性表"注册输出=是"注册,并得到相同的错误.

我尝试用其中一个dll调试regsvr32并找到以下内容:

  1. 我最初无法在DllRegisterServer中放置断点,然后我尝试调试regsvr32的X86版本(来自Windows\SysWOW64),然后才能在DllRegisterServer上中断.有人可以解释一下吗?

  2. DllRegisterServer成功并返回S_OK.

  3. DllRegisterServer返回后,抛出异常,并出现以下异常和堆栈跟踪:

regsvr32.exe中0x759849c1处的第一次机会异常:0xC0000005:访问冲突读取位置0x005bf028.

oleaut32.dll!_MemFree@4()  + 0x25 bytes 
oleaut32.dll!OLE_TYPEMGR::Release()  + 0x1b138 bytes    
oleaut32.dll!ReleaseAppData()  + 0x317 bytes    
oleaut32.dll!_OACleanup@0()  + 0x5 bytes    
ole32.dll!wCoUninitialize(COleTls & Tls, int fHostThread)  Line 2830    C++
ole32.dll!CoUninitialize()  Line 2620   C++
regsvr32.exe!_wWinMain@16()  + 0xa77 bytes  
regsvr32.exe!__initterm_e()  + 0x1b1 bytes  
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8() …
Run Code Online (Sandbox Code Playgroud)

c++ com dll regsvr32 visual-leak-detector

5
推荐指数
1
解决办法
1905
查看次数

标签 统计

c++ ×1

com ×1

dll ×1

regsvr32 ×1

visual-leak-detector ×1