ObjectARX, AutoCAD. Среда программирования библиотеки C++


         

Связь между Приложениями - часть 2


}

Если функция, как предполагается,  будет вызвана с acedInvoke(), приложение, которое определяет это, должен регистрировать функцию,  вызывая acedRegFunc(). (В некоторых случаях acedRegFunc() запрос требован, как описано позже в этой секции.)

Когда acedRegFunc() вызван, чтобы регистрировать функцию, ObjectARX вызывает функцию непосредственно, без того, чтобы пройти цикл отправки приложения. Чтобы определять функцию, вызовите acedRegFunc ().

Внешний функциональный обработчик, зарегистрированный acedRegFunc() не должен иметь никакие параметры и должен возвратить целое число (который является одним из прикладного результата, закодирует — или RSRSLT или RSERR).

Следующая выборка показывает, как funcload () функция в fact.cpp может изменяться, чтобы регистрировать ее функции также как определять их:

typedef int (*ADSFUNC) (void);

// Сначала, определите структуру таблицы: строка, дающая имя AutoCAD функции,

//  и указателя на функцию, возвращающую тип int.

struct func_entry {char *func_name; ADSFUNC func;};

// Объявить функции, которые обрабатывают, вызывает.

int fact (void); // Remove the arguments

int squareroot (void);

// Здесь мы определяем массив имен функции и обработчиков.

//

static struct func_entry func_table[] =

{              {"fact", fact},

{"sqr", squareroot},

};

...

static int funcload()

{

int i;

for (i = 0; i < ELEMENTS(func_table); i++) {

if (!acedDefun(func_table[i].func_name, i))

return RTERROR;

if (!acedRegFunc(func_table[i].func, i))

return RTERROR;

}

return RTNORM;

}

Как показывают выборки кода, первый параметр к acedRegFunc () - указатель функции (названный по имени функциональный обработчик, определенный в исходном тексте), а не внешнее имя функции, определенное acedDefun () и вызванный AutoLISP или acedInvoke (). И acedDefun () и acedRegFunc () передают тот же самый целочисленный функциональный код .

Если зарегистрированная функция должна отыскать параметры, это должно делать так,  делая ее собственный запрос к acedGetArgs ().




Содержание  Назад  Вперед