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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2004, 18:04   #1  
BorDark is offline
BorDark
Участник
Аватар для BorDark
 
24 / 10 (1) +
Регистрация: 09.08.2004
Адрес: планета Земля
? Crystal report и Axapta
Доброе время суток всем.
Есть вопрос.
Подключаюсь к Crystal Report Print Engine через API. Необходимо получить информацию о последней ошибке. Пишу следующий код:

HWND textHandle;
int textLength;
DLLFunction PEGetErrorText;
;
PEGetErrorText = new DLLFunction(crdll, "PEGetErrorText");

PEGetErrorText.returns(ExtTypes::Byte);
PEGetErrorText.arg(ExtTypes::Word,
ExtTypes:ouble,
ExtTypes::Word);

PEGetErrorText.call(job, textHandle, textLength);

После вызова PEGetErrorText показывает ошибку "Функция 'PEGetErrorText' в библиотеке DLL 'C:\Program Files\Common Files\Crystal Decisions\2.0\bin\crpe32.dll' повлекла возникновение исключительной ситуации.".
Никто не сталкивался с такой проблемой? Может быть она в неверном указании типов данных параметров функции (пробовал разные типы).
В общем, буду признателен за любую помощь.
Старый 09.08.2004, 18:24   #2  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Re: Crystal report и Axapta
Цитата:
Изначально опубликовано BorDark
Может быть она в неверном указании типов данных параметров функции (пробовал разные типы).
А ExtTypes:: DWord пробовал?

p.s. Посмотри класс WinApi.
Старый 10.08.2004, 11:14   #3  
BorDark is offline
BorDark
Участник
Аватар для BorDark
 
24 / 10 (1) +
Регистрация: 09.08.2004
Адрес: планета Земля
Re: Re: Crystal report и Axapta
Цитата:
Изначально опубликовано dn

А ExtTypes:: DWord пробовал?

p.s. Посмотри класс WinApi.
Пробовал и DWord - ничего не поменялось, пробовал и Pointer (Аксапта в этом случае вываливается быстрее, чем успеваю моргнуть). WinApi сейчас потрошу, видимо, если и есть где-то ответ, то в этом классе
Старый 10.08.2004, 11:32   #4  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Для всех твоих параметров, кроме textHandle можно смело подставлять DWORD. А вот textHandle - скорее всего Pointer ...
Старый 10.08.2004, 12:57   #5  
BorDark is offline
BorDark
Участник
Аватар для BorDark
 
24 / 10 (1) +
Регистрация: 09.08.2004
Адрес: планета Земля
Результаты изысканий
В общем, саму функцию я добил. Вот код, кому интересно:

<код-1>

Binary textHandle = new Binary(32);
Binary textLength = new Binary(16);
DLLFunction PEGetErrorText;
...
;
PEGetErrorText.returns(ExtTypes::Byte);
PEGetErrorText.arg(ExtTypes::Word,
ExtTypes::Pointer,
ExtTypes::Pointer);
if (!PEGetErrorText.call(_jn, textHandle, textLength))
throw error("Ошибка вызова PEGetErrorText");

</код-1>
А вот дальше опять начались непонятки. Дело в том, что функция PEGetErrorText вызывается в спаринге с PEGetHandleString. Вот описание обоих функций:

BOOL CRPE_API PEGetErrorText (
short printJob,
HANDLE FAR *textHandle,
short Far *textLength );

BOOL CRPE_API PEGetHandleString (
HANDLE textHandle,
char FAR *buffer,
short bufferLength );

А вот пример использования их на некогда родном родном ++

HANDLE textHandle;
short textLength;
char *errorText;

PEGetErrorText ( hJob, &textHandle, &textLength );
errorText = (char*)malloc(textLength);
PEGetHandleString(textHandle, errorText, textLength);

после чего в errorText текстовое описание последней ошибки, связанной с CR Print Engine. Вызываю PEGetHandleString таким образом (после выполнения <код-1>)
...
Binary errorText;
...
;
...
PEGetHandleString = new DLLFunction(crdll, "PEGetHandleString");
PEGetHandleString.returns(ExtTypes::Byte);
PEGetHandleString.arg(ExtTypes:Word,
ExtTypes::Pointer,
ExtTypes::Word);
if (!PEGetHandleString.call(textHandle, errorText, textLength))
throw error("Неудачный вызов PEGetHandleString");

После этого кода PEGetHandleString всегда возвращает false т.е. что-то опять с входными параметрами функции. Я вот думал, может параметры функции PEGetErrorText textHandle и textLength нужно как-то преобразовать, поскольку они описаны как указатели (ниразу не работал с ними в аксапте)? Пробовал такой вариант

Binary errorText;
int errCode;
HWND h;
int len;

h = textHandle.dWord(8); // всегда = 0
len = textLength.Word(8); // всегда = 0 :'((
errorText = new Binary(textLength);
if (!PEGetHandleString.call(h, errorText, len))
...
результат вызова PEGetHandleString тот же - false. Может есть у кого идеи, как обработать указатели?
Старый 10.08.2004, 13:10   #6  
BorDark is offline
BorDark
Участник
Аватар для BorDark
 
24 / 10 (1) +
Регистрация: 09.08.2004
Адрес: планета Земля
Talking Ой, протупил. Решение
В указанном коде надо заменить
h = textHandle.dWord(8); // всегда = 0
len = textLength.Word(8); // всегда = 0 :'((

на

h = textHandle.dWord(0); // то, что надо ;0)
len = textLength.Word(0); // то, что надо :0)

Вот функция, которая будет возвращать код и описание последней ошибки, произошедшей в Crystal Report Engine (мало ли, пригодится кому)


void showError(int _jn, str _descr = "")
{
Binary textHandle = new Binary(32);
Binary textLength = new Binary(16);
Binary errorText;
int errCode;
HWND h;
int len;

DLLFunction PEGetErrorCode;
DLLFunction PEGetErrorText;
DLLFunction PEGetHandleString;
;
PEGetErrorCode = new DLLFunction(crdll, "PEGetErrorCode");
PEGetErrorText = new DLLFunction(crdll, "PEGetErrorText");
PEGetHandleString = new DLLFunction(crdll, "PEGetHandleString");

PEGetErrorCode.returns(ExtTypes::Byte);
PEGetErrorCode.arg(ExtTypes:Word);

PEGetErrorText.returns(ExtTypes::Byte);
PEGetErrorText.arg(ExtTypes::Word,
ExtTypes::Pointer,
ExtTypes::Pointer);

PEGetHandleString.returns(ExtTypes::Byte);
PEGetHandleString.arg(ExtTypes:Word,
ExtTypes::Pointer,
ExtTypes::Word);

try
{
// код ошибки
errCode = PEGetErrorCode.call(_jn);

if (!PEGetErrorText.call(_jn, textHandle, textLength))
throw error("Неудачный вызов PEGetErrorText (showError #1)");
else
{
h = textHandle.dWord(0);
len = textLength.Word(0);
errorText = new Binary(textLength);
if (!PEGetHandleString.call(h, errorText, len))
throw error("Неудачный вызов PEGetHandleString (showError #2)");
}
_descr = _descr + (_descr ? "\n" : "") + int2str(errCode) + " - " + errorText.string(0);
throw error(_descr);
} catch (Exception::Error)
{
this.closeJob(_jn);
throw ("");
}
}

Отдельное спасибо dn за внимание к теме и помощь
Старый 10.08.2004, 13:46   #7  
BorDark is offline
BorDark
Участник
Аватар для BorDark
 
24 / 10 (1) +
Регистрация: 09.08.2004
Адрес: планета Земля
! Поправочка
принято второе чтение кода

строку

errorText = new Binary(textLength);

надо заменить на

errorText = new Binary(len);

а не то аксапта с грохотом и скрежетом вывалится
Теги
crystal reports, ax2.5, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Server 2005 Report Pack for Microsoft Dynamics Axapta 3.0 Recoilme DAX: База знаний и проекты 1 02.08.2007 19:13
Axapta Lessons: Auto Report as finished Blog bot DAX Blogs 0 28.10.2006 18:22
Crystal Report Engine как OLE Automation-сервер malkolio DAX: Программирование 5 18.08.2004 13:23
Использование Crystal Reports вместе с Axapta lakoval DAX: Функционал 1 30.01.2002 23:11
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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