Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: Стоит ли использовать ActiveX, написанный на Delphi, в своих приложениях
Нет 1 14.29%
Да 3 42.86%
В зависимости от кривизны рук разработчика 4 57.14%
Лучше писать ActiveX на другом языке 2 28.57%
Опрос с выбором нескольких вариантов ответа. Голосовавшие: 7. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2010, 13:23   #1
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию Использование библиотек в Delphi

Доброго времени суток!
Сегодня столкнулся вот с такой проблемой: я разрабатываю библиотеку ActiveX на Delphi 2006 и мне необходимо обращаться к другим библиотекам ActiveX, написанных С++Builder. В одной из библиотек есть метод
Get_Values(ID: Integer; var Values: Integer; var Count: Integer): HResult
которые возвращает по указанному ID массив значение Values и количество значений Count.
Я получаю количество значений, но какие бы "танцы с бубном" я бы не использовал - не могу получить массив(((
Вот пример использования данной функции на C++, может кто подскажет как мне получить тоже самое, но в Delphi.
Заранее спасибо)))
long count = 0;
GlobalFilter->get_values (0, NULL, &count );
long * values = ( count == 0 ) ? NULL : new long [ count ];
if ( values != NULL ) GlobalFilter->get_values (0, values, &count );
Konstantin_V вне форума Ответить с цитированием
Старый 21.02.2010, 21:47   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Вот то же самое на делфи:
Код:
type
  PValues = ^TValues;
  TValues = array[ 0..( MaxInt div SizeOf( Integer  ) ) - 1 ] of Integer;

var
  Count : Integer;
  Values : PValues;
...
  Count := 0;
  GlobalFilter.get_values( 0, nil, Count );
  if Count > 0 then
    Values := AllocMem( Count * SizeOf( Integer ) )
  else
    Values := nil;

  if Assigned( Values ) then
    GlobalFilter.get_values( 0, Values, Count );
...
maxionans вне форума Ответить с цитированием
Старый 21.02.2010, 22:01   #3
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию

Все бы хорошо, НО...
1. Второй параметр имеет описание VAR;
2. Второй параметр объявлен как Integer.
Konstantin_V вне форума Ответить с цитированием
Старый 21.02.2010, 22:11   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Хм, не понял - и в чём проблема?

UPDATE:
Я перепутал второй и третий параметры, теперь понял в чём вопрос . Нужно изменить объявление этого метода, заменив второй параметр на Values : PInteger (без var).

Последний раз редактировалось maxionans; 21.02.2010 в 22:14.
maxionans вне форума Ответить с цитированием
Старый 21.02.2010, 22:35   #5
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию

В самом методе? Этот метод импортирован из ocx-файла...
Konstantin_V вне форума Ответить с цитированием
Старый 21.02.2010, 22:51   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Технически передача массива через такой параметр возможна, но само объявление вводит в заблуждение, поэтому лучше заменить на PInteger. А то, что так было импортировно из OCX, это никакой не показатель - импортирование-то автоматическое, а значит не учитывает контекст применения кода.
maxionans вне форума Ответить с цитированием
Старый 21.02.2010, 23:04   #7
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию

Не помогло(((
Все равно возвращется 0, либо то, что я указал до вызова этого метода(((
Konstantin_V вне форума Ответить с цитированием
Старый 21.02.2010, 23:15   #8
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию

у меня в свое время была проблема с параметром buf: byte, который по идее должен возвращать строку.
она решилась через...
buf: pchar и его передачу как byte(buf^)....может и здесь что-то аналогичное, вот что именно никак не соображу...
Konstantin_V вне форума Ответить с цитированием
Старый 21.02.2010, 23:16   #9
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Очевидно, ошибка не в этом коде. Может быть GlobalFilter нужно как-то инициализировать перед использованием или что-то в этом роде?
maxionans вне форума Ответить с цитированием
Старый 21.02.2010, 23:19   #10
Konstantin_V
Новичок
Джуниор
 
Регистрация: 21.02.2010
Сообщений: 17
По умолчанию

другие методы работаеют без проблем,
а инициализация происходит как GlobalFilter.Connect
тем более другие значения то возвращаются, и в коде на с++ все работает...
Konstantin_V вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание\использование своих DLL библиотек Vol666 Общие вопросы Delphi 5 26.08.2009 11:55
использование в delphi com объектов Anekdot Помощь студентам 0 18.06.2009 19:54
Использование JavaScript в Delphi... Valdis Общие вопросы Delphi 2 27.09.2007 08:45
Использование JPEG в Delphi 7 Aslan Мультимедиа в Delphi 11 02.08.2007 13:25
Использование функции Excel из Delphi Геля Общие вопросы Delphi 3 07.06.2007 07:33