Использование C ++ для написания UFL для отчетов Crystal Я получаю возможность реализовать функции UF5SaveState и UF5RestoreState, которые вы не получаете с интерфейсом COM, что приводит к проблемам, которые эти функции существуют для решения.
Функция UF5SaveState, которую я должен реализовать, имеет следующую подпись: -
HGLOBAL __stdcall UF5SaveState (UFTInt32u jobId)
Моя проблема в том, что я не уверен, как сформировать HGLOBAL, который он должен вернуть.
Документы говорят только это: -
UF5SaveState Эта процедура должна быть
реализовано, только если ваш UFL имеет
функция с побочными эффектами [Это действительно так] . это
вызывается Crystal Reports, чтобы получить
состояние от UFL в данный момент
точка. Номер задания Crystal Reports
передается в функцию.
функция возвращает двоичный код состояния UFL
поток во втором параметре, и
возвращает размер состояния в
третий параметр.
Я очень сбит с толку, не в последнюю очередь потому, что он говорит о возврате вещей во втором и даже третьем параметрах. Я на самом деле не человек Windows, поэтому для меня HGLOBAL очень похож на пустой указатель, и поэтому я ожидаю, что он будет более значимым для людей Windows. Я попытался передать обратно результаты GlobalAlloc, попытался создать поток из него (CreateStreamOnHGlobal) и передать его обратно, попробовал просто символ *, и все вылилось в необработанное исключение: -
Необработанное исключение в 0x7c92a978
(ntdll.dll) в crw32.exe: 0xC0000005:
Место записи о нарушении прав доступа
0x00030fa4.
Я не сомневаюсь, что это потому, что он ожидает чего-то другого, но что ...
кусок кода, который не работает только для того, чтобы помочь вам начать работу: -
HGLOBAL __stdcall UF5SaveState (UFTInt32u jobId)
{
ULONG bytesWritten;
HGLOBAL result = GlobalAlloc(GHND, 2048);
LPSTREAM stream = LPSTREAM();
CreateStreamOnHGlobal(result, false, &stream);
stream->Write("ABC", 3, &bytesWritten);
stream->Release();
return result;
}
Итак, представьте, что я хочу сохранить состояние, состоящее только из трех символов "ABC", необязательный нулевой терминатор, как мне это сделать?