http://clarion.iphosting.ru/ExBB/topic. ... &topic=285
From: Vladimir Yakimchenko
> Часто вижу такую (по смыслу) фразу. Мне кажется, господа-товарищи вы себя перемудрили.
> Если дописать к процедуре RAW, то вместо строки (в кларионовском понятии) будет передан АДРЕС.
> Т.е.
> proc procedure(unsigned parString)
> и
> proc procedure(*string parString), raw
> это суть ОДНО И ТО ЖЕ. Только код исходника красивше и понятней.
>
> Поправьте меня, если я не прав...
Поправляю
В общем и целом согласен, и всё же...
не proc procedure(unsigned parString), а proc procedure(long lpData) или proc procedure(ulong lpData)
1) В Win32 - до лампочки: signed, unsigned или long. Win16 уже "осуждается"
Win64 ещё не поддерживается и думаю не скоро будет для клариона "родным".
2) ulong не рекомендую использовать, т.к. кларион при работе с ним делает
слишком много "телодвижений". Для адреса лучше пользовать unsigned.
По существу:
Где и как нагляднее применять LONG/ULONG или *CSTRING/*STRING,
это сильно зависит от процедуры, многие функции Windows API допускают
передачу такого параметра как NULL, соответственно тут уже остается
использовать LONG/ULONG.
Совершенно верно для первого утверждения и не обязательно для второго (см.ниже).
Но в данном контексте, когда "...просто String. А ещё лучше описать параметр как Ulong...",
я бы всё-таки рекомендовал описать параметр как "*string" + RAW.
Конечно, если исходить из языка Кларион (т.е. нашей). Если из позици
WinAPI, тут согласен - правильнее так, как описано в MSDN.
И зависит от того, как дальше полученные данные будут обрабатываться. Если вся дальнейшая обработка не связана с использованием функционала CSTRING/STRING, то и смысла получать данные как *CSTRING/*STRING мало.
Абсолютно согласен!
Вот как в изначально описанной задаче, очевидно, что получается не строка (как таковая) а некая структура, которая мрожет содержать '<0>', таким образом CSTRING/STRING используется просто как буфер, ну дык может более правильно получать данные как proc procedure(*MySpecGrpType MySpecGrp),RAW, где MySpecGrpType это GROUP,TYPE
и тогда уже не LONG/ULONG, и не *CSTRING/*STRING, а *MySpecGrpType must be forever?
Естественно! Если внешнему API нужна структура (жестко описанная!), то дучше использовать GROUP - удобнее для обработки в Кларионе. Для внешнего же API, как известно, что long, что ulong, что *string, *group с RAW всё равно будет одно и тоже - адрес строки символов.
Кстати, по поводу NULL, которое требует иногда внешние API.
Если я не ошибаюсь, то при декларации
proc procedure(*string parString), raw
NULL передаётся (назначается) тоже легко.
Достаточно объявить, скажем APInull &string
где-нибудь в глобальной области и дальше использовать эту метку для назначения нуля (нулевого адреса) для функций, которые это требуют.
proc(APInull) ! и все дела
Сергей - chusha@mail333.com ; chusha@hotbox.ru
Написал: ClaList(2)