Показать сообщение отдельно
Старый 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. Может есть у кого идеи, как обработать указатели?