2010-11-26 21 views
1

C++を使用してCrystalレポート用のUFLを作成する私は、UF5SaveStateおよびUF5RestoreState関数を実装するオプションを得ています。解決する関数が存在する。私が実装しなければならないCrystal Reports UFLのUF5SaveStateおよびUF5RestoreStateのHGLOBAL戻り値

UF5SaveState機能は、この署名を持っている: -

HGLOBAL __stdcall UF5SaveState (UFTInt32u jobId) 

私の問題は、私はそれを返すことが期待だ方法HGLOBALを形成するためにはわからないということです。

ドキュメントはこの唯一の言う: -

UF5SaveStateあなたのUFLは副作用と 機能を持っている場合は、この手順は のみ実施されなければならない[それは確かにありません]。ポイントでUFLから州を取得するには、 を取得するためにCrystal Reportsによって呼び出されるのが です。 Crystal Reportsのジョブ番号 が関数に渡されます。 関数は、2番目のパラメータにUFL状態のバイナリ ストリームを返し、 は、 番目のパラメータの状態のサイズを返します。

2番目と3番目のパラメータで返すことについて話しているので、私はほとんど混乱しています。私は本当に窓の人ではないので、私にはHGLOBALはボイドポインタのように見えるので、窓の人にとって意味があると思っています。

未処理の例外 - :私はそれ(CreateStreamOnHGlobal)からのストリームを作成し、その背中を渡す、のGlobalAllocの結果をみました戻って渡してみた、ただのchar *、非取り扱い例外ですべての結果を試してみました0x7c92a978 (ntdll.dll)(crw32.exe):0xC0000005: アクセス違反の書き込み場所 0x00030fa4。

私はy'allのは行く得るのを助けるために動作しないコードの塊、それが何かを期待しているため、これがあることに疑いはありませんが、何...する

: -

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」のゼロターミネータは省略可能な3文字だけの状態を保存したいと考えています。どうすればいいですか?

+0

私はうれしい、あまりにも... –

+0

誰かがアイデアを持っている必要があり、他の人をfoxedだ:

ここでの「ABC」とHGLOBALを作成するための関連するコードはありますか?問題は十分に明確ではないのですか? –

答えて

0

私は百万年前にカスタムCR機能を書いていました。 uffuncs.hヘッダファイルには、これらの定義を含んでいた:

HGLOBAL CR_EXPORT UF5SaveState (UFTInt32u jobId); 
UFError CR_EXPORT UF5RestoreState (UFTInt32u jobId, 
            HGLOBAL savedState); 

あなたが見つかった文書をHGLOBALは、レポート内で存続するのに十分なほぼ良好ではない、しかし説得力があります。これはポインタで、レポートが別のセッションで再び読み込まれたときに正しく復元されません。それらの神秘的な余分な議論はこれを可能にするだろう。

このヘッダーファイルには、1997年のタイムスタンプがあります。 uffuncs.hヘッダーファイルの最新バージョンを探してみることをおすすめします。それがどこにあっても、私はどこから得たのか覚えていません。ウェブサイトのドキュメントやリンクは完全には不十分です。かなりの典型的なCRの損失は、私が経験した悲惨さの後に再びCRを使うことは決してありませんでした。

+0

どのように私はそれを完全に排除するオプションがあったと思います。私の問題は、HGLOBALを介して返されるはずのものをどのように形成するかです。 –

+0

ああ、ファイルの日付はほぼ正しいです。それは変更されていない最新のCRは、機能を確認します。 –

+0

さらに、HGLOBALは、必要に応じてレポートと共に保存できるデータを指し示す必要がある、すなわちシリアル化されていることを示唆しています。私はそのレベルの持続性を必要としません。ただレポートの生涯が私のために十分であるからです。 –

0

Windowsクリップボードを設定するときに、HGLOBALメモリハンドルを使用するのが一般的です。 Crystal Reportsはおそらくあなたがそれと同じタイプのハンドルを期待しているでしょう。

const char *szInput = "ABC"; 
size_t cchBufLen = strlen(szInput) + 1; // +1 for the null-terminator. 
size_t cbBufSize = cchBufLen * sizeof(char); // Len==Size, but wouldn't if you were using wchar_t instead of char. 

bool bSuccess = false; 
HGLOBAL hGlobalClipMem = ::GlobalAlloc(GHND, cbBufSize); 

if (hGlobalClipMem != NULL) 
{ 
    // Since the "GHND" flags include GMEM_MOVEABLE we must use GlobalLock to 
    // get a pointer to the buffer, and later GlobalFree to get back to normal. 
    char *pGlobalBuffer = reinterpret_cast<char *>(::GlobalLock(hGlobalClipMem)); 

    if (pGlobalBuffer != NULL) 
    { 
     strcpy(pGlobalBuffer, szInput); 
     bSuccess = true; // Set false if anything fails here, so you clean-up. 

     ::GlobalUnlock(hGlobalClipMem); // You unlock the hGlobal, not the pointer that came out of GlobalLock. 
    } 

    // Error-handling path. 
    if (!bSuccess) 
    { 
     ::GlobalFree(hGlobalClipMem); 
     hGlobalClipMem = NULL; 
    } 
} 

return hGlobalClipMem; // Returns NULL on failure. 
+0

私の試みよりもうまくやってみると、例外はあります。 –

+0

GlobalAlloc呼び出しでは、GHNDではなくGPTRを使用してみてください。 (GlobalLock/GlobalUnlockコールはno-opsになり、削除される可能性がありますが、テストを容易にするために残すこともできます)。それでもクラッシュが発生する場合は、問題はどこか別の問題です。例えばそれがどのように渡されているのではなく、どのデータ形式/構造体が返されているか。または破損したスタックなどであっても、ここでクラッシュが発生することがあります(しかし、それは起こりにくい)。あなたのコードはデータを受け取るプロセスと同じプロセスで実行されていますか? –

+0

GPTRをスワップすると、私は若干異なる例外が発生します。 - crw32.exeの0x0012f38eで未処理例外:0xC0000096:特権命令。私はまた、問題は構造体に渡されていると思うが、私はそれが想定されているものに関する情報を持っていない。 –