bdr> Если первый пример мне понятен, то со вторым:
bdr> <Ещё, Если Вы хотите загружать динамически какие то библиотеки то не
bdr> <используёте LoalLibrary, а используйте Cla$LoadLibrary, прототипы те-же
Угу. Только чуточку по другому:
MAP LoadLib(LONG _LibNameAddr),LONG,NAME('Clw$LoadLibrary') END
_LibNameAddr — адрес строки CSTRING с именем библиотеки.
bdr> А можно хоть небольшой комментарий.
bdr> Что это дает?
bdr> Александр Бирюков
По большому счету, эта — простая надстройка над API-шной LoadLibrary:
- сохраняет регистры CX,DX
- забрасывает адрес строки из AX в стек
- вызывает LoadLibraryA
- востанавливает DX,CX
- возвращает AX
По своему опыту общения с Кларионом на низком уровне могу сказать, что Кларион ОЧЕНЬ чувствителен к регистрам. Поэтому, когда идет вызов ЛЮБОЙ процедуры, компилятор предполагает, что после возврата из этой процедуры все основные регистры (BX,CX,DX,SI,DI) имеют тоже значение, что и до вызова. Не «закладывается» компилятор только на AX, и то, только для функций, которые возвращают результат через AX.
Я таким образом уже несколько раз «влетал» со своими asm-процедурами. Пока не стал сохранять/восстанавливать регистры, постоянно «лезли» какие-то левые глюки. Удалось «вычислить» только после кропотливого анализа сбойного участка с откатом назад, до места-источника проблем.
В принципе, компилятор должен учитывать, что процедуры с атрибутами C или PASCAL могут иметь другое поведение по отношению к регистрам. Но, очевидно, иногда где-то он все-таки «прокалывается» или вообще не принимает этого в расчет.
Так что, если по хорошему, то стоит для всех используемых API-шных процедур писать кларионовскую процедуру-надстройку, в которой будет только вызов API-шной процедуры. При генерации Кларионовской процедуры компилятор сам анализирует, какие используются в процедуре регистры и их сохраняет/восстанавливает.