gpt4 book ai didi

c++ - CoGetClassObject 在 ATL 项目中给出了许多 First-chance 异常。我应该担心吗?

转载 作者:行者123 更新时间:2023-11-28 08:29:07 25 4
gpt4 key购买 nike

我编写了一个 COM 对象,该对象又使用第三方 ActiveX 控件。在我的 COM 对象的 FinalConstruct() 中,我使用以下代码实例化 ActiveX 控件:

  HRESULT hRes;
LPCLASSFACTORY2 pClassFactory;
hRes = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
bool bTest = SUCCEEDED(hRes);
if (!bTest)
return E_FAIL;
if (SUCCEEDED(CoGetClassObject(__uuidof(SerialPortSniffer), CLSCTX_INPROC_SERVER, NULL,
IID_IClassFactory2, (LPVOID *)(&pClassFactory))))
{ ... more set up code

当我跨过这条线时 if (SUCCEEDED(CoGetClassObject(__uuidof(SerialPortSniffer), ...,我在“输出”窗口中得到 20 多行内容:

First-chance exception at 0x0523f82e in SillyComDriver.exe: 0xC0000005: Access violation writing location 0x00000000.

我也明白了:

First-chance exception at 0x051e3f3d in SillyComDriver.exe: 0xC0000096: Privileged instruction. First-chance exception at 0x100ab9e6 in SillyComDriver.exe: 0xC000001D: Illegal Instruction.

请注意,这些是第一次出现的异常(exception)情况。程序按预期运行我可以访问第三方方法/属性。尽管如此,我仍然想知道它们为什么会发生。也许我实例化 ActiveX 控件的方式(我想使用它的方法/属性而不是 GUI 的东西)是不正确的?除了我展示的代码,我还放了一行

#import "spsax.dll" no_namespace 

在 stdafx.h 中这就是我的简单演示项目所需的所有代码。我注意到这个问题是因为我(无意中)在我的“真实”项目中设置了“异常中断”选项并且它在这条线上中断了。一旦我删除它,它也可以工作。

如果您已经读到这里,谢谢您,也许我可以再问一个小问题。在我的演示项目中,如果我右键单击 SerialPortSniffer 并“转到定义”,它会将我带到文件 C:....\AppData\Local\Temp\spsax.tlh。有人可以解释一下吗?最后,在我的“真实”项目中,右键单击 SerialPortSniffer 并进行定义会导致“符号‘SerialPortSniffer’未定义”。它似乎并不影响程序。有什么设置我搞砸了吗?

顺便说一下,我所有的代码都是用 VS2008 编写的。

谢谢,戴夫

最佳答案

这些绝对是您在 Windows 程序中可能遇到的最糟糕的硬件异常。像串行端口嗅探器这样简单的东西绝对没有理由曾经抛出这样的异常,更不用说捕获它们并处理它们了。

不过,它确实存在,您对此无能为力。你只能希望并祈祷这不会在某一天让你痛不欲生。就我个人而言,该组件很快就会出现在我的垃圾堆中。

#import 语句从 COM 类型库自动生成代码。它生成一个包含声明的 .tlh 文件和一个包含 COM 方法包装器的 .tli 文件。 .tlh 文件包含智能指针 (xxxxPtr),使实例化 COM 对象和调用其方法变得容易。这就是为什么“Goto Definition”会将您带到该文件。

关于c++ - CoGetClassObject 在 ATL 项目中给出了许多 First-chance 异常。我应该担心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com