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. ?? Будем надеяться, что хорошая мысля приходит опосля ![]() Кстати, насчет 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/ |