TeeChart
VCLコントロールは、VCLアプリケーションのデフォルトでGDI+(Windowsグラフィックスライブラリ)を使用します。

TeeChartのGDI+のエディタダイアログ
備考:以下の修正は、既に最新のVCLバージョンに含まれています。
ダウンロードリンク
DLL内でGDI+を使用する時に1つ問題があります。GDI+は使用前に初期化しなければならず、その初期化はDLL自体ではなく呼び出し側のEXEのプロセスで行うべきである、ということです。
(これに関するMicrosoftの情報は、こちらにあります。)
ファイルの初期化セクションの末尾にあるEmbarcadero
RAD Studio
RTL WinApi.GDIPOBJ.pasユニットが実行可能なアプリケーションでそのユニットを使う時だけGDI+を初期化するために「IsLibraryではない」か確認するのはそのためです。
問題は、チャートコントロールを含んだDLLを持っていて、GDI+が正しく初期化されていない場合、Windows
GDI+ gdiplus.dll内のコードからアクセス違反が発生する!ということです。
解決策はいたって簡単です。DLLの機能を呼び出す前に、EXEアプリケーションに以下のコードを追加してGDI+を初期化することです。
uses
WinAPI.GDIPObj, WinAPI.GDIPApi ;
//
StartupInput
構造体の初期化
StartupInput.DebugEventCallback := nil;
StartupInput.SuppressBackgroundThread := False;
StartupInput.SuppressExternalCodecs := False;
StartupInput.GdiplusVersion := 1;
GdiplusStartup(gdiplusToken, @StartupInput, nil);
(必須には思えませんが)EXEの最終手順の1つとしてGDI+の初期化を解除することがさらに推奨されています。
GdiplusShutdown(gdiplusToken);
次のTeeChartのリリース(近日!)には、この状況を改善するためのマイナーな修正が含まれます。GDI+が何らかの理由で初期化されない場合、例外を回避するために「旧式の」GDIが代わりに使用されます。
Delphi RAD
XE5で作成された簡単なテストプロジェクトをこちらからダウンロードしてください。EXEとDLLが含まれています。DLLには、Form1とChart1が含まれています。EXEのメインユニットがGDI+を初期化し、DLLを呼び出してチャートを表示します。 |