Я занимался этим уже несколько часов, и это начинает расстраиваться. :(
У меня есть 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.
Кроме того, когда я запускаю свое приложение и выбираю пункт тестового меню, который запускает приведенный выше код, в первый раз я получаю сообщение об ошибке «Класс не зарегистрирован», и если я щелкну его еще раз после этого, я увижу: « Такой интерфейс не поддерживается"... Очень странно.