使用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/

10-10 11:34