как получить double из IDispatchPtr
От: Vasilich2222  
Дата: 18.03.14 21:12
Оценка:
В очередной раз надо написать клиента, который использует COM object, но что-то я туплю

#import вижу в tlh файле
функция IDispatchPtr Mean( IDispatch * Data ); которая возвращает значение вероятно double.

также в OleView вижу
[id(0x00000026), helpstring("Mean function")]
IDispatch* Mean(IDispatch* Data);

пример использования в Паскале (не уверен, что весь пример правильный) вот такой
mean : double;
mean := FTia.ProcessingSystem.Mean(FImage2.Data).real;

мне нужно на С. в принципе компилятор не ругается на
double ddd = 2;
ddd = m_TIA->ProcessingSystem()->Mean( pImagePlot->Data);

и программа выдает, что ddd = 1.0 но если это mean, то это должно быть между 10000 и 20000

Чтобы использовать Invoke() мне нужно знать ID. Получить ID можно через GetIDsOfNames(), но я не знаю какое использовать имя.
Да, GetTypeInfoCount() возвращает 0.
Re: как получить double из IDispatchPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.03.14 21:56
Оценка:
Здравствуйте, Vasilich2222, Вы писали:

V>пример использования в Паскале (не уверен, что весь пример правильный) вот такой


V>mean : double;

V>mean := FTia.ProcessingSystem.Mean(FImage2.Data).real;

FTia.ProcessingSystem.Mean(FImage2.Data) — это вызов описанного выше "IDispatch* Mean(IDispatch* Data)". Она возвращает объект, который имеет свойство или метод "real", который возвращает уже число. Поищи у себя tlh файле это real, может он там есть.

V>Чтобы использовать Invoke() мне нужно знать ID. Получить ID можно через GetIDsOfNames(), но я не знаю какое использовать имя.

V>Да, GetTypeInfoCount() возвращает 0.

IDispatchPtr pMeaner = m_TIA->ProcessingSystem()->Mean( pImagePlot->Data);
_variant_t result = pMeaner->getProperty("real"); // за точность не ручаюсь
double ddd = VT_R8(&result); // и тут тоже
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: как получить double из IDispatchPtr
От: Vasilich2222  
Дата: 18.03.14 22:17
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Vasilich2222, Вы писали:


V>>пример использования в Паскале (не уверен, что весь пример правильный) вот такой


V>>mean : double;

V>>mean := FTia.ProcessingSystem.Mean(FImage2.Data).real;

Vi2>FTia.ProcessingSystem.Mean(FImage2.Data) — это вызов описанного выше "IDispatch* Mean(IDispatch* Data)". Она возвращает объект, который имеет свойство или метод "real", который возвращает уже число. Поищи у себя tlh файле это real, может он там есть.


V>>Чтобы использовать Invoke() мне нужно знать ID. Получить ID можно через GetIDsOfNames(), но я не знаю какое использовать имя.

V>>Да, GetTypeInfoCount() возвращает 0.

Vi2>
Vi2>IDispatchPtr pMeaner = m_TIA->ProcessingSystem()->Mean( pImagePlot->Data);
Vi2>_variant_t result = pMeaner->getProperty("real"); // за точность не ручаюсь
Vi2>double ddd = VT_R8(&result); // и тут тоже
Vi2>


Спасибо за ответ, но это не проходит.
pMeaner имеет только 7 методов (3 от COM и 4 от Disзatch).
real — это double паскале и паскаль это дело переворавчивает сам, так же как и VB.
Re[3]: как получить double из IDispatchPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.03.14 05:40
Оценка:
Здравствуйте, Vasilich2222, Вы писали:

V>Спасибо за ответ, но это не проходит.

V>pMeaner имеет только 7 методов (3 от COM и 4 от Disзatch).
V>real — это double паскале и паскаль это дело переворавчивает сам, так же как и VB.

Тебе нужно либо выложить TLB любо IDL описание интерфейса, имеющего метод Mean.

Как общее соображение: obj->f(ps)->g(ps)... может иметь место в случае возврата функцией объекта. Тем есть несколько механизмов, реализующие корректное исполнение ->. Если "real" — не название метода, то тогда у m_TIA->ProcessingSystem()->Mean(pImagePlot->Data) запрашивается свойство-по-умолчанию, имеющее ID=0, до тех пор пока не вернётся не-объект, из которого получают плавающее значение double преобразованием вариантов (VARIANT).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: как получить double из IDispatchPtr
От: rus blood Россия  
Дата: 19.03.14 09:04
Оценка:
Здравствуйте, Vasilich2222, Вы писали:

V>Чтобы использовать Invoke() мне нужно знать ID. Получить ID можно через GetIDsOfNames(), но я не знаю какое использовать имя.

V>Да, GetTypeInfoCount() возвращает 0.

Может быть, DISPID_VALUE ?
Имею скафандр — готов путешествовать!
Re[2]: как получить double из IDispatchPtr
От: Аноним  
Дата: 19.03.14 16:17
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Vasilich2222, Вы писали:


V>>Чтобы использовать Invoke() мне нужно знать ID. Получить ID можно через GetIDsOfNames(), но я не знаю какое использовать имя.

V>>Да, GetTypeInfoCount() возвращает 0.

RB>Может быть, DISPID_VALUE ?

нет, не DisPID_VALUE

UINT uy;
HRESULT hr1 = ttt->GetTypeInfoCount( &uy);
====================
получаю:
hr1 = S_OK
uy = 0
Re[3]: как получить double из IDispatchPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.03.14 16:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>UINT uy;

А>HRESULT hr1 = ttt->GetTypeInfoCount( &uy);
А>====================
А>получаю:
А>hr1 = S_OK
А>uy = 0

Это вполне может быть. Это значит, что объект не поддерживает передачу информации о своём типе или своих типах, но тем не менее связку GetIDsOfNames+Invoke должен поддерживать каждый IDispatch.

DISPID_VALUE, оно же просто 0, это DISPID метода или свойства, являющегося методом-по-умолчанию, т.е. нет необходимости передавать что-то в GetIDsOfNames, чтобы получить этот 0, можно просто вызвать Invoke с этим 0.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: как получить double из IDispatchPtr
От: Аноним  
Дата: 19.03.14 18:28
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Vasilich2222, Вы писали:


V>>Спасибо за ответ, но это не проходит.

V>>pMeaner имеет только 7 методов (3 от COM и 4 от Disзatch).
V>>real — это double паскале и паскаль это дело переворавчивает сам, так же как и VB.

Vi2>Тебе нужно либо выложить TLB любо IDL описание интерфейса, имеющего метод Mean.


Vi2>Как общее соображение: obj->f(ps)->g(ps)... может иметь место в случае возврата функцией объекта. Тем есть несколько механизмов, реализующие корректное исполнение ->. Если "real" — не название метода, то тогда у m_TIA->ProcessingSystem()->Mean(pImagePlot->Data) запрашивается свойство-по-умолчанию, имеющее ID=0, до тех пор пока не вернётся не-объект, из которого получают плавающее значение double преобразованием вариантов (VARIANT).


так я же в самом начале написал, что в OleView (открываю tlb файл и) вижу
[id(0x00000026), helpstring("Mean function")]
IDispatch* Mean(IDispatch* Data);

я так понимаю, что когда я вызываю функцию Mean, то она отрабатывает и создает объект с интерфейсом IDispatch, в котором где-то в VARIANT и находится нужный мне double. Pascal делает переход с IDispatch в double с помощью добавления ".real".
я также предополагаю, что вызов Invoke с id(0x00000026) вызовет функцию Mean ...
Re[5]: как получить double из IDispatchPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.03.14 19:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>так я же в самом начале написал, что в OleView (открываю tlb файл и) вижу

А>[id(0x00000026), helpstring("Mean function")]
А>IDispatch* Mean(IDispatch* Data);

Ну нет так нет. За этим IDispatch, возвращаемый Mean(), стоит объект, такой же большой и непознанный, как и имеющий Mean().

А>я так понимаю, что когда я вызываю функцию Mean, то она отрабатывает и создает объект с интерфейсом IDispatch, в котором где-то в VARIANT и находится нужный мне double. Pascal делает переход с IDispatch в double с помощью добавления ".real".

А>я также предополагаю, что вызов Invoke с id(0x00000026) вызовет функцию Mean ...

Конечно, вызовет функцию Mean и получит назад некий объект (по сути указатель 32 бита, именно столько содержится в IDispatch*), в котором нет никаких VARIANTов и double. Нету. Я не скажу за Паскаль, но я спрашивал насчёт метода или свойства ".real" с отрицательным ответом. Я понимаю, что Паскаль как и VB, много может провернуть "за сценой", но для этого я тебе информации вагон и набросал, чтобы ты на месте разобрался.

Чтобы получить double от объекта, переданного только битами указателя IDispatch*, нужно вызвать что-то на этом указателе. Никаких других чудес нет и можешь даже не фантазировать на эту тему, что там какая-то тайная магия.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: как получить double из IDispatchPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 20.03.14 07:11
Оценка:
Здравствуйте, Vasilich2222, Вы писали:

V>Спасибо за ответ, но это не проходит.


А что не проходит? Наверное, я просто писал код на коленке, чтобы он сработал.

CComDispatchDriver pMeaner = m_TIA->ProcessingSystem()->Mean(pImagePlot->Data);
CComVariant result;
hr = pMeaner.GetPropertyByName(OLESTR("real"), & result); // может это свойство
hr = pMeaner.GetProperty(DISPID_VALUE, & result);
hr = pMeaner.Invoke0(OLESTR("real"), & result); // может это метод
hr = pMeaner.Invoke0(DISPID_VALUE, & result);


Какой-то hr ведь будет же удовлетворять SUCCEEDED.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.