09.08.2004, 18:04 | #1 |
Участник
|
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 |
Участник
|
Re: Crystal report и Axapta
Цитата:
Изначально опубликовано BorDark
Может быть она в неверном указании типов данных параметров функции (пробовал разные типы). p.s. Посмотри класс WinApi. |
|
10.08.2004, 11:14 | #3 |
Участник
|
Re: Re: Crystal report и Axapta
Цитата:
Изначально опубликовано dn
А ExtTypes:: DWord пробовал? p.s. Посмотри класс WinApi. |
|
10.08.2004, 11:32 | #4 |
Участник
|
Для всех твоих параметров, кроме textHandle можно смело подставлять DWORD. А вот textHandle - скорее всего Pointer ...
|
|
10.08.2004, 12:57 | #5 |
Участник
|
Результаты изысканий
В общем, саму функцию я добил. Вот код, кому интересно:
<код-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 |
Участник
|
Ой, протупил. Решение
В указанном коде надо заменить
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 |
Участник
|
Поправочка
принято второе чтение кода
строку errorText = new Binary(textLength); надо заменить на errorText = new Binary(len); а не то аксапта с грохотом и скрежетом вывалится |
|