ニュートン メニュー

株式会社ニュートン

マイクロソフトパートナー

YouTube公式チャンネル

体験版ダウンロード

製品案内

ライセンスパック

ライセンスについて

カスタマイズ受付

製品購入ガイド

オンラインショップ
直販ショップ !
ニュートンストアで購入
コンポーネントソース
コンポーネントソースで購入

優待販売・
 キャンペーン情報

ユーザサービス
〔サポートページ〕

サポート体制

お知らせ
・ニュースリリース
・懐かCM
・イベント出展
・製品関連記事

会社概要

個人情報保護方針

お問い合わせ先

DLL内のTEECHARTとGDI+
March 12th, 2014
 

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


TeeChartGDI+のエディタダイアログ

 

備考:以下の修正は、既に最新の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
で作成された簡単なテストプロジェクトをこちらからダウンロードしてください。EXEDLLが含まれています。DLLには、Form1Chart1が含まれています。EXEのメインユニットがGDI+を初期化し、DLLを呼び出してチャートを表示します。 

Copyright (C) NEWTONE Corporation. All rights reserved.