Проблема с CoGetObject
От: Antonariy  
Дата: 18.07.08 09:42
Оценка:
Есть некий интерфейс в 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 (Синтаксическая ошибка).
Что я делаю не так?
Re: Проблема с CoGetObject
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.08 13:15
Оценка:
Здравствуйте, 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>Что я делаю не так?

_ROT_и_GetObject
Автор: Vi2
Дата: 23.05.03
Оттуда:

GetObject(pathname) соотвествует функции CoGetObject(строка моникера). В частности, имя файла — это файловый моникер, но им моникеры не исчерпываются.

GetObject(, class) эквивалентно запросу GetActiveObject(class), потому как моникера-то нет (1-ый параметр).

GetObject("", class) эквивалентно запросу CoCreateInstance(class), потому что опять-таки моникера нет.


Поэтому для тебя подходит GetActiveObject, причем взятый у _com_ptr_t
IDocViewPtr dv;
HRESULT r = dv.GetActiveObject(L"DocView.Application");
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Проблема с CoGetObject
От: Antonariy  
Дата: 21.07.08 06:36
Оценка:
Спасибо, все получилось.
Re[3]: Проблема с CoGetObject
От: Antonariy  
Дата: 21.07.08 07:32
Оценка:
Рано радовался
Появилась проблема с этим методом:
BSTR ret = dv->GetHTML4Url((BSTR)wstrUrl);

Вместо некоторых html-документов (одних и тех же) стала возвращаться ошибка "неправильный указатель". Либо указатель на кучу мусора. При этом метод GetHTML4Url всегда отрабатывает нормально и пытается вернуть осмысленный текст. С чем это может быть связано?
Re[4]: Проблема с CoGetObject
От: Antonariy  
Дата: 21.07.08 07:46
Оценка:
A>С чем это может быть связано?
Это оказывается связано с длиной возвращаемой строки.
У BSTR что ли ограничение на 32762 байта?
Re[4]: Проблема с CoGetObject
От: Vi2 Удмуртия http://www.adem.ru
Дата: 21.07.08 10:23
Оценка:
Здравствуйте, Antonariy, Вы писали:

A>Появилась проблема с этим методом:

A>BSTR ret = dv->GetHTML4Url((BSTR)wstrUrl);

GetHTML4Url, скорее всего, возвращает _bstr_t объект, который является С++ объектом с деструктором и не может быть присвоен простому указателю BSTR. Проверь в отладчике — куда заходит и что происходит.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Проблема с CoGetObject
От: Antonariy  
Дата: 21.07.08 11:19
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>GetHTML4Url, скорее всего, возвращает _bstr_t объект, который является С++ объектом с деструктором и не может быть присвоен простому указателю BSTR.

Так точно, _bstr_t. Исполнение уходило в COMUTIL.H и куда-то еще глубже в MFC-шные дебри.
Заработала такая конструкция:
BSTR ret = SysAllocString(dv->GetHTML4Url((BSTR)wstrUrl));
Правда я не уверен, что это правильно, несмотря на то, что работает. Например wstrUrl объявлен как LPCWSTR, а мне сказали, что его нельзя скастовать к BSTR.
Re[6]: Проблема с CoGetObject
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.07.08 06:59
Оценка:
Здравствуйте, 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, правда, ограниченно — до первого нулевого символа.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Проблема с CoGetObject
От: Antonariy  
Дата: 28.07.08 10:22
Оценка:
Все сделал, все заработало за одним исключением: dll не регистрируется на компах, где не установлена студия.
Regsvr32 выдает «Ошибка при вызове LoadLibrary("c:\...dll") — Приложение не было запущено, поскольку оно некорректно настроено.»
Чего ей не хватает?
Re[8]: Проблема с CoGetObject
От: Vi2 Удмуртия http://www.adem.ru
Дата: 28.07.08 10:44
Оценка:
Здравствуйте, Antonariy, Вы писали:

A>Все сделал, все заработало за одним исключением: dll не регистрируется на компах, где не установлена студия.

A>Regsvr32 выдает «Ошибка при вызове LoadLibrary("c:\...dll") — Приложение не было запущено, поскольку оно некорректно настроено.»
A>Чего ей не хватает?

Выполняемый модуль в Windows может требовать другие модули, которые расположены в отдельных DLLках. Посмотри depends-ом те библиотеки, которых нет на компе без студии, и копируй их вместе со своим сервером.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[9]: Проблема с CoGetObject
От: Antonariy  
Дата: 28.07.08 11:08
Оценка:
Не хватает msvcr80d.dll
Если я правильно понимаю, d означает debug, а я компилировал в relase, по идее должна была подцепиться msvcr80.dll.
Соответственно перенос msvcr80d.dll ничего не дает.
Re[9]: Проблема с CoGetObject
От: Antonariy  
Дата: 28.07.08 11:20
Оценка:
Все, проблема решена. Это IDE тупило, сбрасывало теущую конфигурацию на debug.
Появилась папка release, тамошняя dll регистрируется без проблем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.