Прошу прощения, что немного не по адресу, но за неделю перелопатил практически весь интернет, а ответа так и не нашёл. Если моя тема находится не в той ветке, то просьба к модераторам перенести её в правильное место.
Microsoft Visual C++ 2005. Пробую сделать внешнюю компоненту к 1С. Согласно официальной инструкции, наследуюсь от IInitDone и перегружаю все его методы и мелоды IUnknown. DLL благополучно регистрируется, и я в состоянии при помощи клиента собственного изготовления создать объект ко-класса:
Код
HRESULT hr = ::CoGetClassObject(CLSID_Protection,
CLSCTX_INPROC_SERVER,
NULL,
IID_IInitDone,
(void **)&;pIInitDone);
Методы AddRef() и Release() вызываются, объект благополучно создаётся. Я даже в состоянии вызвать метод Init() передав ему NULL в качестве параметра.
Но при попытке создать объект в 1С (любой версии - v77, v81) возникает падение системы после вызова метода Init(): Access violation reading location 0x00000000. Опытным путём было обнаружено, что в качестве параметра Init(IDispatch *pConnection) получает нулевой указатель на интерфейс 1С-Предприятия. Причём я не использую этот параметр, но, возможно, его использует 1С после вызова Init-а. Сам Init() совершенно безобиден:
Код
HRESULT __stdcall CProtection::Init(IDispatch *pConnection)
{
return S_OK;
}
Если вернуть E_FAIL, 1С не вылетит, но и объект не создаст. С чем может быть связано такое поведение? В каких ветках реестра компонента должна обязательно зарегистрироваться, чтобы 1С считал её полноценно своей? Замечу, что ATL я не использую, хочу все необходимые действия проделать самостоятельно.
Что ещё есть в интернете по внешним компонентам, кроме того, что я уже прочёл (материалы с ИТС можно не предлагать - я их тщательно изучил)? Большое спасибо за любые подсказки!