(изменено: _kT, 21 ноября 2011г. 14:01:02)

Тема: Dictionary через com c++

Здравствуйте! А есть ли пример на c++ использования Dictionary?
Я делаю:

TDMS::ITDMSApplicationPtr pApp = NULL;
/*получаю ссылку на объект*/
pApp->get_Dictionary()

и вот get_Dictionary() в параметрах просит VARIANT и IDispatchPtr, и как потом с IDispatchPtr работать я не понял.
Хотелось бы получить методы и свойства

object.Dictionary([Name])

//Вопрос про 3-ю версию

Re: Dictionary через com c++

_kT пишет:

Здравствуйте! А есть ли пример на c++ использования Dictionary?
Я делаю:

TDMS::ITDMSApplicationPtr pApp = NULL;
/*получаю ссылку на объект*/
pApp->get_Dictionary()

и вот get_Dictionary() в параметрах просит VARIANT и IDispatchPtr, и как потом с IDispatchPtr работать я не понял.
Хотелось бы получить методы и свойства

object.Dictionary([Name])

//Вопрос про 3-ю версию

IDispatchPtr - то что он возвращает и есть Dictionary.

1) можно .Invoke делать с номером, но это не удобно.

2) CComPtr<IDispatch> pDisp;
    get_Dictionary(CComVariant(L"SomeDict"), (void **)&pDisp);
    CComQIPtr<IDictionary> pDict = pDisp;
   
   Чтобы были классы IDictionary нужно импортировать #import "scrrun.dll" - где-то толи в Windows\System, толи в Windows\System32 лежит.

Re: Dictionary через com c++

Спасибо за ответ, но на:

#import "C:\Windows\System32\scrrun.dll"

Выдаёт кучу ошибок:

Ошибка    57    error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "GetTotalSize"    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tlh    639
Ошибка    58    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tlh    639
Ошибка    59    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tlh    639
Ошибка    61    error C3803: _variant_t Scripting::IDrive::TotalSize: тип свойства несовместим с одной из функций доступа к нему 'int Scripting::IDrive::GetTotalSize(void)'    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tlh    639
Ошибка    62    error C2660: Scripting::IDrive::_variant_t: функция не принимает 2 аргументов    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    472
Ошибка    64    error C2589: (: недопустимая лексема справа от '::'    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    475
Ошибка    66    error C2143: синтаксическая ошибка: отсутствие ";" перед "::"    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    475
Ошибка    67    error C2059: синтаксическая ошибка: ::    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    475
Ошибка    68    error C2143: синтаксическая ошибка: отсутствие ";" перед "{"    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    475
Ошибка    69    error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)    c:\users\*\documents\visual studio 2008\projects\*\*\win32\debug\scrrun.tli    475

(изменено: _kT, 23 ноября 2011г. 13:46:24)

Re: Dictionary через com c++

Спасибо vorona. Вот что получилось:

#include <atlbase.h>
#include <atlstr.h>
#import <scrrun.dll> rename("FreeSpace","FSpace") rename("Unknown", "Unk")
    IDispatchPtr pDisp = NULL;
    pApp->get_Dictionary(CComVariant(L"SomeDict"), &pDisp);
    CComQIPtr<scripting::IDictionary> pDict = pDisp;
    pDict->...; //вызываемый метод

Вдруг кому пригодится.