gpt4 book ai didi

c++ - Crystal 报表 UFL UF5SaveState 和 UF5RestoreState 中的 GLOBAL 返回值

转载 作者:太空宇宙 更新时间:2023-11-04 14:25:29 25 4
gpt4 key购买 nike

使用 C++ 为 Crystal 报表编写 UFL,我可以选择实现 UF5SaveState 和 UF5RestoreState 函数,COM 接口(interface)无法实现这些功能,从而导致存在这些函数要解决的问题。

我必须实现的 UF5SaveState 函数具有以下签名:-

HGLOBAL __stdcall UF5SaveState (UFTInt32u jobId)

我的问题是我不确定如何形成预期返回的 HGLOBAL。

文档只说了这一点:-

UF5SaveState This procedure must be implemented only if your UFL has a function with side effects [It does indeed]. It is called by Crystal Reports to obtain the state from the UFL at a given point. The Crystal Reports job number is passed to the function. The function returns the UFL state binary stream in the second parameter, and returns the size of the state in the third parameter.

我最困惑,尤其是因为它谈到在第二个甚至第三个参数中返回东西。我不是真正的 Windows 用户,所以对我来说 HGLOBAL 看起来很像一个空指针,所以我希望它对 Windows 用户更有意义。我尝试传回 GlobalAlloc 的结果,尝试从中创建一个流 (CreateStreamOnHGlobal) 并将其传回,只尝试一个 char *,所有结果都导致未处理的异常:-

Unhandled exception at 0x7c92a978 (ntdll.dll) in crw32.exe: 0xC0000005: Access violation writing location 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 还不足以持久保存在报告中。它是一个指针,当报表在另一个 session 中再次加载时,它不会正确恢复。那些神秘的额外参数将允许这样做。

这个头文件有一个 1997 年的时间戳。我只能建议您尝试查找更新版本的 uffuncs.h 头文件。不管它在哪里,我都不记得我是从哪里得到它的。网站文档和链接是完全不够的。非常典型的 CR 损失,在经历了痛苦之后,我决定不再使用 CR。

关于c++ - Crystal 报表 UFL UF5SaveState 和 UF5RestoreState 中的 GLOBAL 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4284226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com