OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 21 Апрель, 2021 07:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: [safe] параметры
СообщениеДобавлено: Суббота, 10 Февраль, 2007 18:04 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
При генерации COM-модуля (DevComInterfaceGen.GenCustomInterface) некоторые методы имеют параметры с флагом [safe]. Компилятор на них ругается. Кто-нибудь знает, на что их можно заменить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 10 Февраль, 2007 23:21 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9402
Откуда: Россия, Орёл
А IMPORT COM есть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 11 Февраль, 2007 00:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4619
Откуда: Россия, Орёл
Навскидку нашел это:

DevTypeLibs:
Код:
   | WinOle.VT_SAFEARRAY:
         IF wrapper IN opts THEN out.WriteSString("CtlT.Any")
         ELSE out.WriteSString("ARRAY [safe] OF "); WriteType(t.u.lptdesc^, tinfo, opts, out)
         END

Документация .NET:
- COM safe arrays are self-describing. By examining the safe array, the runtime marshaler can determine the rank, size, bounds, and usually the type of the array contents at run time... // какой новаторский подход... C-массивы уже использовать не рекомендуют. :)
- VT_SAFEARRAY Indicates a SAFEARRAY. Not valid in a VARIANT. ??

Будем надеяться, что хорошая мысля приходит опосля :D

Кстати, насчет IF wrapper IN opts THEN out.WriteSString("CtlT.Any"), а нет ли какого COM-интерфейса для этого самого SAFEARRAY?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 11 Февраль, 2007 01:58 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Илья Ермаков: а как же, в первую очередь.

Евгений Темиргалеев: спасибо, хоть что это должно быть стало понятно. Теперь бы ещё найти как это реализовать.

А вообще это GenCustomInterface выдаёт весьма интересный полуфабрикат :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 11 Февраль, 2007 04:05 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Нашёл супостата. Называется WinOleAut.SAFEARRAY


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 13 Февраль, 2007 15:21 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4619
Откуда: Россия, Орёл
Кусок CtlC.ocf и процедуры для работы с безопасным массивом:
$OLEAUT32.dll -> SafeArrayAccessData, SafeArrayAllocData, SafeArrayAllocDescriptor, SafeArrayUnaccessData, SysAllocString, SysFreeString, SysStringLen, VariantClear <-


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [safe] параметры
СообщениеДобавлено: Вторник, 16 Февраль, 2021 19:12 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 419
Откуда: Украина, Днепропетровская обл.
Господа, а кто уже работал с SAFEARRAY из Компонентного Паскаля?
Нужно разработать DLL, которую можно вызывать из Excel.

Код на VBA:
Код:
Declare Function SafeArr Lib "MyLib.dll" (ByVal n As Long, ByRef arr() As String) As Long

Dim arr(2) As String
arr(0) = "String_1"
arr(1) = "String_2"

res = SafeArr(2, arr) ' 2 передаём по значению, arr по ссылке

Код на КП:
Код:
MODULE MyLib; IMPORT WinApi, WinOleAut, SYSTEM;

PROCEDURE SafeArr* (n: INTEGER; arr: POINTER TO WinOleAut.SAFEARRAY): INTEGER;
   TYPE ArrPtr = POINTER TO ARRAY [untagged] OF WinApi.PtrSTR;
   VAR ptrarr: ArrPtr; res: INTEGER;
BEGIN
   IF WinOleAut.SafeArrayAccessData(arr, SYSTEM.VAL(WinApi.PtrVoid, ptrarr)) < 0 THEN RETURN -1 END;

   (* -> Здесь: обращение к ptrarr[0] крэшит Excel *)

   IF WinOleAut.SafeArrayUnaccessData(arr) < 0 THEN RETURN -1 END;
   res := WinApi.MessageBox(0, "OK", "OK", {});
   RETURN 0
END SafeArr;

END MyLib.

Вызов процедуры SafeArr отрабатывает из Экселя норм. Но стоит попробовать обратиться к данным безопасного массива даже на чтение - сразу сбой. Хотя я, казалось бы, копирую логику из кода на Си.

Если есть успешный опыт работы с SAFEARRAY, прошу поделиться. Спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2021, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB