OberonCore
https://forum.oberoncore.ru/

[safe] параметры
https://forum.oberoncore.ru/viewtopic.php?f=2&t=380
Страница 1 из 1

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

При генерации COM-модуля (DevComInterfaceGen.GenCustomInterface) некоторые методы имеют параметры с флагом [safe]. Компилятор на них ругается. Кто-нибудь знает, на что их можно заменить?

Автор:  Илья Ермаков [ Суббота, 10 Февраль, 2007 23:21 ]
Заголовок сообщения: 

А IMPORT COM есть?

Автор:  Евгений Темиргалеев [ Воскресенье, 11 Февраль, 2007 00:15 ]
Заголовок сообщения: 

Навскидку нашел это:

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 ]
Заголовок сообщения: 

Илья Ермаков: а как же, в первую очередь.

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

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

Автор:  Иван Горячев [ Воскресенье, 11 Февраль, 2007 04:05 ]
Заголовок сообщения: 

Нашёл супостата. Называется WinOleAut.SAFEARRAY

Автор:  Евгений Темиргалеев [ Вторник, 13 Февраль, 2007 15:21 ]
Заголовок сообщения: 

Кусок CtlC.ocf и процедуры для работы с безопасным массивом:
$OLEAUT32.dll -> SafeArrayAccessData, SafeArrayAllocData, SafeArrayAllocDescriptor, SafeArrayUnaccessData, SysAllocString, SysFreeString, SysStringLen, VariantClear <-

Автор:  Oleg N. Cher [ Вторник, 16 Февраль, 2021 19:12 ]
Заголовок сообщения:  Re: [safe] параметры

Господа, а кто уже работал с 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, прошу поделиться. Спасибо.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/