В очередной раз надо написать клиента, который использует 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.
Здравствуйте, 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); // и тут тоже
Здравствуйте, 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.
Здравствуйте, 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).
Здравствуйте, 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
Это вполне может быть. Это значит, что объект не поддерживает передачу информации о своём типе или своих типах, но тем не менее связку GetIDsOfNames+Invoke должен поддерживать каждый IDispatch.
DISPID_VALUE, оно же просто 0, это DISPID метода или свойства, являющегося методом-по-умолчанию, т.е. нет необходимости передавать что-то в GetIDsOfNames, чтобы получить этот 0, можно просто вызвать Invoke с этим 0.
Здравствуйте, 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 ...
Здравствуйте, Аноним, Вы писали:
А>так я же в самом начале написал, что в 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*, нужно вызвать что-то на этом указателе. Никаких других чудес нет и можешь даже не фантазировать на эту тему, что там какая-то тайная магия.