使用C ++为Crystal报表编写UFL,我可以选择实现UF5SaveState和UF5RestoreState函数,而COM接口却没有提供这些函数,从而导致这些函数存在要解决的问题。
我必须实现的UF5SaveState函数具有以下签名:
HGLOBAL __stdcall UF5SaveState (UFTInt32u jobId)
我的问题是我不确定如何组建预期返回的HGLOBAL。
文档只说:
UF5SaveState此过程必须为
仅当您的UFL具有
具有副作用[确实如此]。它是
由Crystal Reports调用以获得
UFL在给定状态下的状态
点。水晶报表工作编号
传递给函数。的
函数返回UFL状态二进制
在第二个参数中流式传输
返回状态的大小
第三个参数。
我最困惑,尤其是因为它谈论的是在第二个甚至第三个参数中返回内容。我不是Windows真正的人,因此对我来说HGLOBAL看起来很像是空指针,因此我希望它对Windows更加有意义。我试过传回GlobalAlloc的结果,尝试从中创建一个流(CreateStreamOnHGlobal),然后传回,仅尝试使用char *,所有这些都会导致未处理的异常:-
0x7c92a978处未处理的异常
crw32.exe中的(ntdll.dll):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”零终止符可选的状态,我该怎么做?
最佳答案
一百万年前,我编写了一个自定义的CR函数。 uffuncs.h头文件包含以下定义:
HGLOBAL CR_EXPORT UF5SaveState (UFTInt32u jobId);
UFError CR_EXPORT UF5RestoreState (UFTInt32u jobId,
HGLOBAL savedState);
但是,您发现的文档引人注目,但HGLOBAL几乎不够好,无法保存在报表中。这是一个指针,当在另一个会话中再次加载报表时,该指针将无法正确还原。那些神秘的额外争论将允许这样做。
该头文件的时间戳为1997。我只能建议您尝试查找uffuncs.h头文件的最新版本。无论它在哪里,我都不记得我从哪里得到的。该网站的文档和链接完全不足。很典型的CR损失,我决定在经历了痛苦之后不再使用CR。
关于c++ - Crystal Reports UFL UF5SaveState和UF5RestoreState中的GLOBAL返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4284226/