AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.11.2006, 19:35   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Аргументы функции
Пожалуйста помогите. Никак не могу понять в чем дело...
Есть функция glClearColor() в библиотеке opengl32.dll , она получает в качестве параметров 4 аргумента типа вещественного числа. Вот мой код:
Код:
 
DLLFunction glClearColor      = new DLLFunction(opengl32, "glClearColor");
;
glClearColor.returns(ExtTypes::void);

glClearColor.arg(ExtTypes::Double, ExtTypes::Double, ExtTypes::Double,                ExtTypes::Double);
при выполнении вызова функции:
Код:
glClearColor.call(1.0, 0.0, 0.0, 1.0);
происходит выдача сообщения:
Значение регистра ESP не было сохранено при вызове функции 'glClearColor' в библиотеке DLL 'opengl32.dll'. Причиной может являться вызов функции DLL, которая объявлена с неверным числом аргументов.

что можно с этим сделать?
Старый 22.11.2006, 22:49   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Прототип функции на 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(), то возвращаемое значение будет неправильным
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: belugin (9), Dark Light (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передача функции в качестве параметра lemchey_white DAX: Программирование 20 21.01.2008 22:51
Вызов экспортируемой функции DLL Jabberwocky DAX: Программирование 8 12.09.2006 17:20
Выполнение функции "перенос начальных сальдо" в середине года SSM DAX: Функционал 2 21.07.2005 10:08
ошибка в функции str2con ddadream DAX: Функционал 2 14.01.2004 15:12
Что происходит с переменной табличного типа после выхода из функции? vitk DAX: Программирование 3 10.12.2001 15:34

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:51.