永劫回帰 > 劉邦 (Ryuhou) > 劉邦カラープラグイン(仕様) > プラグインの作り方

プラグインの作り方

ここではプラグインの作り方を順を追って説明したいと思います。
この文章はDLLの作成経験者を対象にしているので、DLLの作成方法については他のWebページを参考にして下さい。
練習を兼ねて、カラープリンタなどに用いられている簡単なCMY形式に変換するプラグインを作ってみたいと思います。
[参考]RGBからCMYに変換するには以下のような変換式を用います。

 Y = 255 - B
 M = 255 - G
 C = 255 - R
 
 R = 255 - C
 G = 255 - M
 B = 255 - Y


  R = Red, G = Green, B = Blue
  C = Cyan, M = Magenta, Y = Yellow
 範囲 : 0〜255

はじめに

今回はcmy.cというソースファイルを作成し、この中に以下のように書き込んでいきます。
プロジェクトの作成が必要な環境の場合はプロジェクトを作成し、必要なファイルを追加して下さい。


ヘッダーファイル

"windows.h"と"rpi_color104.h"を定義します。
"rpi_color104.h"の中にはプラグインを作る際に必要な構造体や定数などの定義がされています。
ここでは"rpi_color104.h"となっていますが、バージョンが上がれば"rpi_color202.h"などの名前に変わるので適宜読み替えて下さい。
#include <windows.h>
#include "rpi_color104.h"

DllMain

DLLのエントリポイントを定義します。
このようにTRUEを返すだけで構いません。
BOOL  WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID lpReserved) {
	return TRUE;
}

PluginInfo

ソフトがプラグインの情報を参照するときに呼ばれます。
このようにRPI_PLUGININFO構造体にプラグインの情報を入れます。
それぞれのメンバに何を入れるのかは下記のコメントを参考にして下さい。
uVerメンバに指定するプラグインのバージョンは、例えば104と指定するとソフト側では1.04と表示されます。
RPI_SDK_VERとはプラグイン仕様のバージョンのことです。
RYUHOU_EXPORT BOOL WINAPI PluginInfo(RPI_PLUGININFO *pi) {
	pi->uType      = RPI_PLUGINTYPE_COLOR;		// 必ずRPI_PLUGINTYPE_COLORを指定します
	pi->uVer       = (RPI_SDK_VER<<16) + 100;	// 上位ワードにSDK・下位ワードにプラグインのバージョン
	pi->lpName     = "CMY2";			// カラー形式名(ファイル名と同じにすることを強く推奨します)
	pi->lpProducer = "myself";			// 制作者名
	pi->lpInfo     = "テストプラグインです。";	// その他のコメント・情報等
	return TRUE;
}

RGBtoX

RGB形式からCMY形式に変換する関数です。
RPI_RGBDATA構造体に格納されたRGB値を変換してRPI_COLORDATA構造体に代入します。
また、uTypeメンバにはカラー形式のパラメータタイプを指定します。パラメータタイプには下記を使用することが出来ます。
 RPI_COLORTYPE_PARAM1 → パラメータ1つ
 RPI_COLORTYPE_PARAM3 → パラメータ3つ
 RPI_COLORTYPE_STRING → 文字列
ここでは、パラメータは3つなのでRPI_COLORTYPE_PARAM3を指定します。
RYUHOU_EXPORT BOOL WINAPI RGBtoX(const RPI_RGBDATA *rgb, RPI_COLORDATA *cd) {
	cd->uType = RPI_COLORTYPE_PARAM3;	// パラメータのタイプ
	cd->nParam3 = 255 - rgb->uBlue;		// Y
	cd->nParam2 = 255 - rgb->uGreen;	// M
	cd->nParam1 = 255 - rgb->uRed;		// C
	return TRUE;
}

XtoRGB

CMY形式からRGB形式に変換する関数です。
RPI_COLORDATA構造体に格納されたRGB値を変換してRPI_RGBDATA構造体に代入します。
この関数ではRPI_COLORDATA構造体のメンバ(CMY値)が正しい値・範囲なのかを判断して、異常な値ならFALSEを返すようにしなければいけません。
RYUHOU_EXPORT BOOL WINAPI XtoRGB(const RPI_COLORDATA *cd, RPI_RGBDATA *rgb) {
	if((cd->nParam1<0)||(cd->nParam1>255)||(cd->nParam2<0)||(cd->nParam2>255)||(cd->nParam3<0)||(cd->nParam3>255)) return FALSE;
	rgb->uRed = 255 - cd->nParam1;		// C
	rgb->uGreen = 255 - cd->nParam2;	// M
	rgb->uBlue = 255 - cd->nParam3;		// Y
	return TRUE;
}

defファイル(モジュール定義ファイル)を作成する

VCなどのコンパイラではそのままDLLを作成すると関数名が_PluginInfo@4などになってしまうので、下記のような内容のdefファイルを作成する必要があります。
EXPORTS
	PluginInfo
	RGBtoX
	XtoRGB
このファイルをcmy.defとしてプロジェクトに追加します。
エクスポートする関数を増やすときはここに関数名を追加して下さい。


コンパイル

以上でプラグインの作成は終わりです。
ソースファイルをまとめてみるとこんな感じになります。
後はコンパイルしてDLLを作成してみて下さい。
劉邦は*.DLLでも認識しますが、わかりやすくするために拡張子は*.RPIに変えることを推奨します。

作成したプラグインはryuhou.exeと同じ階層にあるcolorフォルダ内に入れて下さい。


プラグインのサイズを小さくする

VCの場合は下記をソースに追加することでサイズをかなり小さくすることが出来ます。
(バージョンによっては動作しないかもしれません)
// ランタイムライブラリを使わないようにしてエントリポイントを変更する
#pragma comment(linker, "/nodefaultlib:\"libc.lib\"")
#pragma comment(linker, "/entry:\"DllMain\"")
// ファイルサイズを4KBの整数倍にならないようにする
#pragma comment(linker, "/opt:nowin98")

// 更にリテラル文字列が多い場合、下記のように
// .textに埋め込むように指定すればサイズを小さくできます
#pragma comment(linker, "/merge:.data=.text")
#pragma comment(linker, "/merge:.rdata=.text")
#pragma comment(linker, "/section:.text,erw ")
// ↑を指定したことによる警告を表示しないようにする
#pragma comment(linker, "/ignore:4078")

以下のWebページを参考にさせて頂きました。
軽い実行可能ファイルの作り方 [VC++の使い方]
Visual C++の小技




戻る

Copyright (C) 輪廻(rinne) 2006-