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