Прототип функции на C выглядит так
X++:
WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
, где GLclampf определен как
typedef float GLclampf;
Тип
double опредлен как восьмибайтовый, а
float как четырехбайтовый.
Что бы сделать правильный вызов этой функции надо параметры передавать как DWord. При этом необходимо переводить вещественное число Axapta в четырехбайтовый тип float (single precision) (т.е. в int). Если интересно, как это делается надо искать здесь
IEEE Standard 754 Floating Point Numbers.
А в Axapta можно выкрутиться так
X++:
DLLFunction glClearColor = new DLLFunction(opengl32, "glClearColor");
COMVariant parm1 = new COMVariant();
COMVariant parm2 = new COMVariant();
COMVariant parm3 = new COMVariant();
COMVariant parm4 = new COMVariant();
;
glClearColor.returns(ExtTypes::void);
glClearColor.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
parm1.float(1.0);
parm2.float(0.0);
parm3.float(0.0);
parm4.float(1.0);
glClearColor.call(parm1.int(), parm2.int(), parm3.int(), parm4.int());
Обратите внимание, что для установки значения параметров необходимо вызывать именно метод float(). Если воспользоваться, например, double(), то возвращаемое значение будет неправильным