Есть некий интерфейс в tlb, который реализован в ActiveX EXE. Запускаю EXE, проверяю в VBA через GetObject — работает, хочу получить от него этот интерфейс и делаю следующее:
#import"DocView.tlb" no_namespace
...
IDocView *dv;
HRESULT r = CoGetObject(L"DocView.Application"),NULL,__uuidof(dv),(void**) &dv);
Результат — 0x800401e4 (Синтаксическая ошибка).
Что я делаю не так?
Здравствуйте, Antonariy, Вы писали:
A>Есть некий интерфейс в tlb, который реализован в ActiveX EXE. Запускаю EXE, проверяю в VBA через GetObject — работает, хочу получить от него этот интерфейс и делаю следующее:
A>#import"DocView.tlb" no_namespace
A>...
A> IDocView *dv;
A> HRESULT r = CoGetObject(L"DocView.Application"),NULL,__uuidof(dv),(void**) &dv);
A>Результат — 0x800401e4 (Синтаксическая ошибка). A>Что я делаю не так?
Вместо некоторых html-документов (одних и тех же) стала возвращаться ошибка "неправильный указатель". Либо указатель на кучу мусора. При этом метод GetHTML4Url всегда отрабатывает нормально и пытается вернуть осмысленный текст. С чем это может быть связано?
Здравствуйте, Antonariy, Вы писали:
A>Появилась проблема с этим методом:
A>BSTR ret = dv->GetHTML4Url((BSTR)wstrUrl);
GetHTML4Url, скорее всего, возвращает _bstr_t объект, который является С++ объектом с деструктором и не может быть присвоен простому указателю BSTR. Проверь в отладчике — куда заходит и что происходит.
Здравствуйте, Vi2, Вы писали:
Vi2>GetHTML4Url, скорее всего, возвращает _bstr_t объект, который является С++ объектом с деструктором и не может быть присвоен простому указателю BSTR.
Так точно, _bstr_t. Исполнение уходило в COMUTIL.H и куда-то еще глубже в MFC-шные дебри.
Заработала такая конструкция:
BSTR ret = SysAllocString(dv->GetHTML4Url((BSTR)wstrUrl));
Правда я не уверен, что это правильно, несмотря на то, что работает. Например wstrUrl объявлен как LPCWSTR, а мне сказали, что его нельзя скастовать к BSTR.
Здравствуйте, Antonariy, Вы писали:
A>Правда я не уверен, что это правильно, несмотря на то, что работает. Например wstrUrl объявлен как LPCWSTR, а мне сказали, что его нельзя скастовать к BSTR.
2) BSTR ret = dv->GetHTML4Url(wstrUrl)).Detach();
3) BSTR ret = dv->GetHTML4Url(wstrUrl)).copy();
wstrUrl нужно передавать так как есть — он передастся в соответствующий конструктор _bstr_t. А кастовать его, конечно же, нельзя, потому как LPCWSTR != BSTR, хотя BSTR == LPCWSTR, правда, ограниченно — до первого нулевого символа.
Все сделал, все заработало за одним исключением: dll не регистрируется на компах, где не установлена студия.
Regsvr32 выдает «Ошибка при вызове LoadLibrary("c:\...dll") — Приложение не было запущено, поскольку оно некорректно настроено.»
Чего ей не хватает?
Здравствуйте, Antonariy, Вы писали:
A>Все сделал, все заработало за одним исключением: dll не регистрируется на компах, где не установлена студия. A>Regsvr32 выдает «Ошибка при вызове LoadLibrary("c:\...dll") — Приложение не было запущено, поскольку оно некорректно настроено.» A>Чего ей не хватает?
Выполняемый модуль в Windows может требовать другие модули, которые расположены в отдельных DLLках. Посмотри depends-ом те библиотеки, которых нет на компе без студии, и копируй их вместе со своим сервером.
Не хватает msvcr80d.dll
Если я правильно понимаю, d означает debug, а я компилировал в relase, по идее должна была подцепиться msvcr80.dll.
Соответственно перенос msvcr80d.dll ничего не дает.