Сбой CComPtr CoCreateInstance () - PullRequest
0 голосов
/ 01 декабря 2008

У меня есть COM .dll, успешно зарегистрированный на regsvr32, но почему-то CoCreateInstance() не удается создать один из его интерфейсов. Есть ли бесплатный инструмент, который может определить причину сбоя?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2008

Прежде всего, проверьте возвращаемое значение вызова CoCreateInstance (). Во-вторых, вы можете использовать такой инструмент, как Regmon или Process Monitor, чтобы увидеть, что поиск реестра не удается. Таким образом, вы можете быстро определить, что именно не было зарегистрировано, как вы ожидаете.

0 голосов
/ 10 декабря 2008

Если ваша библиотека реализована на C ++ и имеет отладочную информацию, вы также можете попробовать отладку с помощью MSVC, чтобы перейти в CoCreateInstance.

Полагаю, вы пропустили правильное сопоставление вашего класса с одним из интерфейсов. Я сделал это несколько раз по ошибке. Если вы используете ATL, вам нужно убедиться, что ваш реализующий класс является производным от интерфейса, а также вы добавили COM_INTERFACE_ENTRY(I____) для вашего интерфейса в COM_MAP:

BEGIN_COM_MAP(CFileHelper)
    COM_INTERFACE_ENTRY(IFileHelper)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IStream)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Или, возможно, GUID отличается между файлом IDL и тем, что находится в реализующем файле C ++. MSVC6 имеет досадную ошибку, из-за которой мастеру не удается создать новый класс из-за прав доступа к файлу (например, некоторые файлы, которые он хочет изменить, доступны только для чтения), но он уже добавил GUID в файл IDL, и вы исправляете разрешите доступ к файлу и перейдите, чтобы сделать это снова, в GUID будет несогласованность, и это трудно уловить. В идеальном случае определения GUID хранятся ТОЛЬКО в одном файле, и вам не придется об этом беспокоиться.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...