Я занимаюсь этим уже несколько часов, и это начинает расстраивать.: (
У меня есть COM DLL, которую я создал в .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 (больше сообщений "SUCCESS", чемПо крайней мере, сообщения «ИМЯ НЕ НАЙДЕНО», но мне не хватает, кажется, тонны мест в реестре.Например, ключ «TreatAs», «InprocServerX86» и т. Д.
Если кто-нибудь может мне сказать:
A) Что я делаю неправильно, в первую очередь
или
B) Список того, какие именно значения реестра добавляются, когда вы «регистрируете» COM DLL, чтобы я мог зайти туда и вручную сделать это сам.(не идеально, я понимаю).
TIA!
Мой код:
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
}
Добавлены примечания:
Машина разработки работает под управлением Win XP32-разрядный, и «машина» с унаследованным приложением на самом деле является виртуальной машиной на компьютере разработчика, также работающей под управлением XP.
Кроме того, когда я запускаю свое приложение и выбираю пункт меню «Тест», который запускаетПриведенный выше код, в первый раз, когда я получаю сообщение об ошибке «Класс не зарегистрирован», и если я нажимаю его снова после этого, я вижу: «Такой интерфейс не поддерживается» ... Очень странно.