CoCreateInstance возвращает «Класс не зарегистрирован»

Я занимался этим уже несколько часов, и это начинает расстраиваться. :(

У меня есть DLL COM, которую я создал в .NET 4.0, и я хочу иметь доступ к устаревшему приложению, созданному в VC++ 6. Она видна для COM, я уже успешно создал TLB и SNK, перенес на машину с устаревшим кодом C++, #импортировал TLB, все компилируется нормально

Выполнил следующее:

RegAsm ProtracFunctions.dll /codebase

gacutil /i ProtracFunctions.dll

Они оба успешны.

Когда я собираюсь запустить свое приложение, как только я нажимаю CoCreateInstance, я получаю сообщение «Класс не зарегистрирован».

Я заметил в RegEdit, что моя DLL действительно зарегистрирована. Именно тогда я провел небольшое исследование, скачал ProcMon и понял, что он ищет в разных местах. CLSID немного отличается, и если я попытаюсь изменить файл ProtracFunctions.reg (чтобы использовать GUID, который собирает ProcMon), который дает мне RegAsm, и это ДЕЙСТВИТЕЛЬНО влияет на ProcMon (больше сообщений «УСПЕХ», чем «ИМЯ По крайней мере сообщения NOT FOUND»), но мне кажется, что мне не хватает тонны мест в реестре. Такие как ключ "TreatAs", "InprocServerX86" и т.д.

Если бы кто-нибудь мог мне сказать:

A) Что я делаю неправильно в первую очередь

или

B) Список какие именно значения реестра добавляются, когда вы «регистрируете» COM-DLL, чтобы я мог войти туда и сделать это вручную. (не идеально, я понимаю).

ТИА!

Мой код:

CoInitialize(NULL);
CComQIPtr <ProtracFunctions::IDockingStation> spTestCom;
HRESULT hRes = spTestCom.CoCreateInstance(CLSID_ProtracDCS, 0, CLSCTX_ALL);

if (SUCCEEDED (hRes))
{
    printf("Created the instance");

    unsigned char Ret;
    unsigned char ErrCode;
    SAFEARRAY *pSA;

    spTestCom->DockConnect(3, 19200, &Ret);
    spTestCom->GetTagReads(1, &ErrCode, &pSA); 

    spTestCom->PowerOffReader(1, &Ret);
    spTestCom->DockDisconnect();

    spTestCom.Release ();
}
else
{
   _com_error error(hRes);
   LPCTSTR errorText = error.ErrorMessage();

   AfxMessageBox(errorText);

   //automatic cleanup when error goes out of scope
}

Добавленные примечания:

Машина разработки работает под управлением 32-разрядной версии Win XP, а «машина» с устаревшим приложением на самом деле является виртуальной машиной на компьютере разработки, также работающей под управлением XP.

Кроме того, когда я запускаю свое приложение и выбираю пункт тестового меню, который запускает приведенный выше код, в первый раз я получаю сообщение об ошибке «Класс не зарегистрирован», и если я щелкну его еще раз после этого, я увижу: « Такой интерфейс не поддерживается"... Очень странно.

7
задан kogh 19 March 2012 в 20:23
поделиться