Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
stuv
0 / 0 / 0
Регистрация: 11.12.2016
Сообщений: 1
#1

Работа с типом данных VARIANT - C++ COM

11.12.2016, 20:53. Просмотров 778. Ответов 1
Метки нет (Все метки)

Всем привет. Сейчас работаю с некоторой динамической библиотекой(*.dll). Пытаюсь из этой dll использовать некую функцию GetTitleIDList. Прототип функции в Visual C++ выглядит так GetTitleIDList(VARIANT_BOOL , int, int, int*, VARIANT*,VARIANT*).
В документации к dll эта функция описывается так:
This method retrieves two arrays which contain the IDs and titles of all entities (in the selected ID range) with the same type as the current object.
GetTitleIDList( bIncludeID, minID, maxID, count, listID, listTITLE )

Input:
BOOL bIncludeID
If True, the titles are in the form “ID..title” (for example, “1..Steel”. If False, only the title, without the ID or separator is returned.

INT4 minID
The minimum and maximum entity IDs to retrieve. You can set minID=maxID=0 to retrieve all available entities.


INT4 maxID

Output:

INT4 count
The number of entities retrieved. This is the number of entries in listID and listTITLE.

INT4 listID[0..count-1]
The IDs of the available entities.

STRING listTITLE[0..count-1]
The titles of the available entities. If the entity does not have a title, the string “Untitled” will be returned.

Return Code:

[FE_FAIL=0 FE_OK=-1
This function is only available for entity types that have titles (Mate*rial, Property, View, etc)
В документации приведен пример на Visual BAsic
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
‘Attach to FEMAP........................
Dim femap As Object
Set femap = GetObject(, "femap.model")
‘Look at Output Set 3...................
Dim oc As Object
Set oc = femap.feOutputSet()
oc.Get (3)
Dim od As Object
Set od = oc.Vector(1)
Dim rc As Integer
Dim Count As Long
Dim ID As Variant
Dim Title As Variant
Dim Row As Integer
‘Retrieve ID and Title of all available Output Vectors...
rc = od.GetTitleIDList(False, 0, 0, Count, ID, Title)
‘ Display list in cells of a spreadsheet.................
For Row = 1 To Count
  Worksheets(1).Cells(Row, 1).Value = ID(Row - 1)
  Worksheets(1).Cells(Row, 2).Value = Title(Row - 1)
Next Row
Теперь как я пытаюсь это использовать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    int count;
    SAFEARRAY *TitleArray;
    SAFEARRAY *IDArray;
        BSTR str;
    TitleArray=SafeArrayCreateVector(VT_BSTR,0,9);
    IDArray=SafeArrayCreateVector(VT_I4,0,9);
         if(TitleArray==0)return 0;
    if(IDArray==0)return 0;
        if(pEntity->GetTitleIDList(true,0,0, &count,  (VARIANT*) IDArray, (VARIANT*) TitleArray)==-1){
        for (long i=0; i<count;i++){
             if(SafeArrayGetElement(TitleArray,&i,&str){
                MessageBox(0,str,str,0); // в этом месте планировалось вызвать SendMessage(hList, LB_ADDSTRING,0, (LPARAM)str); 
              }      
            }
       }
В сообщении MessageBox выводятся иероглифы вместо строк на английском языке.
пробовал использовать VARIANT
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       VARIANT ListTitle
        int count;
    SAFEARRAY *TitleArray;
    SAFEARRAY *IDArray;
        BSTR str;
    TitleArray=SafeArrayCreateVector(VT_BSTR,0,9);
    IDArray=SafeArrayCreateVector(VT_I4,0,9);
         if(TitleArray==0)return 0;
    if(IDArray==0)return 0;
        ListTitle.vt=VT_ARRAY|VT_BSTR;
        ListTitle.parray=TitleArray;
        if(pEntity->GetTitleIDList(true,0,0, &count,  (VARIANT*) IDArray, &ListTitle)==-1){
        for (long i=0; i<count;i++){
              //тут пока не понятно как из VARIANT ListTitle извлечь массив строк и вывести их хотя бы в MessageBox
              }      
            }
       }
Подскажите в чём моя ошибка и как лучше исправить? Cпасибо
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2016, 20:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с типом данных VARIANT (C++ COM):

Работа с VARIANT - C++ COM
Добрый день. Есть функция STDMETHODIMP MyClass::InitiateRequest(VARIANT* pVal) { byte mac = { 0x00, 0x8a, 0x0C, 0x98, 0x11, 0x15 }; ...

Тип данных Variant, не понятное свойство - C++ COM
Народ, подскажите, что это за свойство &quot;u&quot; используется в примере (см. стр 4) в описании на этот тип данных ничего похожего не нашел. ...

Ошибка с типом - C++
помогите пожалуйста найти ошибку Не могу скомпилировать программу пишет что проблема с типом float в функции prog3#include &lt;stdio.h&gt; ...

Как работать с типом VARIANT в редакторе скриптов WinCC? - SCADA
Здравствуйте, хочу повесить скрипт на календарь при изменении даты, получаю:void OnPropertyChanged(char* lpszPictureName, char*...

Работа с типом данных String - Delphi
здравствуйте,помогите пожалуйста с задачей,не могу понять с чего начать требуется написать программу,которая считывает текст и выводит на...

Работа с файловым типом данных - Free Pascal
Пусть дан файл целых чисел. Создайте новый файл, значения в который записываются по следующему правилу: суммируются подряд идущие значения...

1
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,852
12.12.2016, 09:47 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
stuv,
1) если написано VARIANT * то не нужно приводить типы (SAFEARRAY - это не VARIANT - SAFEARRAY хранится в VARIANT) - ваш последний способ выглядит правильным по отношению к ListTitle, но по отношению к IDArray по прежнему насилие над типами.
2) у вас это выходные параметры - не нужно их создавать или инициализировать - достаточно написать
C++
1
2
VARIANT listTITLE;
VariantInit(&listTITLE);
передать адрес в функцию (&listTITLE) и читать данные из возвращенного из функции SAFEARRAY например через SafeArrayGetElement
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2016, 09:47
Привет! Вот еще темы с ответами:

Работа с типом данных Long - PHP
Здравствуйте. У меня снова проблемы с передачей параметров в web-службу. Метод в службе принимает строку и long: public...

Работа с файловым типом данных - Pascal
Записать в файл f последовательного доступа N натуральных чисел. Получить в другом файле последовательного доступа все компоненты файла f,...

Си шарп- DataGridView работа с булевым типом данных - C#
Задача: DataGridView отображает поля из базы данных с булевым типом, смысл в том что пользователь должен отмечать их как True или False. ...

Работа со строковым типом данных. Вывести символы находящиеся между знаками. - C++ Builder
Помогите решить на C++Builder. &quot;Дана символьная строка. Получить новую строку, взяв из данной все символы между первым и вторым символом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru