CoGetClassObject дает много исключений первого шанса в проекте ATL. Должен ли я беспокоиться? - PullRequest
0 голосов
/ 29 мая 2010

Я написал COM-объект, который, в свою очередь, использует элемент управления ActiveX сторонней организации. В моем FinalConstruct () для моего COM-объекта я создаю экземпляр элемента управления 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 строк в окне «Вывод» с указанием:

Исключение первого шанса в 0x0523f82e в SillyComDriver.exe: 0xC0000005: Место записи о нарушении прав доступа 0x00000000.

Я также получаю строки:

Исключение первого шанса в 0x051e3f3d в SillyComDriver.exe: 0xC0000096: Привелегированная инструкция. Во-первых, шанс исключение в 0x100ab9e6 в SillyComDriver.exe: 0xC000001D: Нелегальная инструкция.

Обратите внимание, что это исключения первого шанса. Программа работает, как и ожидалось, я могу получить доступ к сторонним методам / свойствам. Тем не менее, мне остается удивляться, почему они происходят. Возможно, мой способ создания экземпляра элемента управления ActiveX (для которого я хочу использовать его методы / свойства, а не вещи GUI) неверен? Помимо кода, который я показываю, я также поставил строку

#import "spsax.dll" no_namespace 

в stdafx.h Вот и весь код, необходимый для моего простого демонстрационного проекта. Я заметил эту проблему, потому что я (непреднамеренно) установил параметры «разбить на исключения» в моем «реальном» проекте, и он ломался на этой линии. Как только я удалил это, это также работает.

Если вы прочитали это далеко, спасибо, и, возможно, я могу задать еще один незначительный вопрос. В моем демонстрационном проекте, если я щелкну правой кнопкой мыши на SerialPortSniffer и "перейду к определению", он перейдет в файл C: .... \ AppData \ Local \ Temp \ spsax.tlh Кто-нибудь может это объяснить? Наконец, в моем «реальном» проекте щелчок правой кнопкой мыши на SerialPortSniffer и переход к определению приводит к «Символу SerialPortSniffer не определен». Похоже, это не влияет на программу. Есть какие-то настройки, которые я испортил?

Кстати, весь мой код написан с VS2008.

Спасибо, Dave

Ответы [ 2 ]

1 голос
/ 29 мая 2010

Это определенно худший вид аппаратных исключений, с которыми вы когда-либо сталкивались в программе Windows. Нет абсолютно никакой причины, что что-то такое простое, как анализатор последовательного порта, должно когда-либо генерировать подобные исключения, не говоря уже о перехвате и обработке их.

Тем не менее, это так, и вы ничего не можете с этим поделать. Вы можете только надеяться и молиться, чтобы это не помешало вам в задницу. Лично этот компонент быстро окажется в моей трэш-куче.

Инструкция #import автоматически генерирует код из библиотеки типов COM. Он генерирует файл .tlh с объявлениями и файл .tli с обертками метода COM. Файл .tlh содержит интеллектуальные указатели (xxxxPtr) для упрощения создания экземпляра COM-объекта и вызова его методов. Вот почему «Goto Definition» переносит вас в этот файл.

0 голосов
/ 29 мая 2010

Обычно беспокоиться не о чем.

Когда выдается исключение, отладчик уведомляется и, в зависимости от конфигурации отладчика, может остановить приложение или позволить приложению возобновить работу в нормальном режиме. Это исключение «первого шанса». Если приложение возобновляет работу, оно может перехватить исключение и сделать все необходимое в исключительном случае.

Если приложение не обрабатывает исключение, оно становится исключением «второго шанса», и отладчик получает уведомление снова. Отладчик обычно настроен на остановку приложения на этом этапе, чтобы вы могли увидеть, что пошло не так.

Таким образом, если вы получаете исключение первого шанса и не получаете исключение второго шанса позже, это обычно означает, что в этом нет ничего плохого, и приложение обрабатывает исключения в «изящном» вопросе.

(Также см. http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx)

...