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