Правило Кларион и правила внешних API

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Была тема: "Получение строки, содержащей символы ASCII-null"
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)
Ответить