Rikkymodule/外部DLLとの連携用関数

このページでは、Rikkymoduleで追加される関数を紹介する。

この関数を使うと、プロジェクトファイルに保存するプラグインの保存データをバックアップファイルに保存することができるようになります

```
extern "C" \_\_declspec(dllimport) BOOL RikkyBackupRegister(FILTER \*fp);

```

を宣言します

func\_init関数内でRikkyBackupRegister(fp)を実行します

* 戻り値がTRUEならば、正しく登録されたことを意味します

```
後はrikky\_memoryが実行します

## RikkyExitRegister関数

この関数を使うと、aviutl.exeを終了するときに設定した関数を実行することができます

pluginには終了時に実行できる関数がAviUtl側からあらかじめ用意してあり、これはDLL用の関数です

```
extern "C" \_\_declspec(dllimport) BOOL RikkyExitRegister(void \*exit\_function, void \*param);

```

を宣言します

スクリプトなどで使う関数のどこかでRikkyExitRegisterを実行すれば登録されます

* 登録する関数はvoid\*\*を引数にする関数にしてください

TRUEなら成功、FALSEなら失敗です
* 第1引数は実行したい関数
* 第2引数は渡したい変数などのポインタ、なければNULL

### 例

```
PONIT p;
void func(void \*\*param);
BOOL isfirst = 1;
static int aviutl\_no\_kansu(lua\_State \*L){
 if(isfirst){
 RikkyExitRegister(func, &p);
 isfirst = 0;
 }
 //渡した関数が実行するタイミング的に、渡すアドレスはグローバル変数の方が適しています
 p.x = 10;
 p.y = 20;
}
void func(void \*\*param){
 POINT \*pt = (POINT \*)param[0];
 //引数の[0]が登録時に渡したポインタ
 //引数の[1]はEXFUNC \*exfuncです
 //何かしらの処理
 //ちなみにpt->xは10、pt->yは20の値を示します
}

```

## RikkySaveRegister関数、RikkyLoadRegister関数

これらの関数を使うと、プロジェクトを保存、読み込み時に変数をプロジェクトファイルに置く、取り出すなどできます

pluginには保存時、読み込み時に実行できる関数がAviUtl側からあらかじめ用意してあり、これはDLL用の関数です

```
extern "C" \_\_declspec(dllimport) BOOL RikkySaveRegister(char \*register\_name, void \*save\_function, void \*param);

```

RikkySaveRegister関数は登録に成功すればTRUEを返し、失敗すればFALSEを返します
* 第1引数は登録名で、誰とも被らないようにします、また同一DLL内で別の名前なら別々にデータを保存し、同一名ならどれかで登録されます
* 第2引数は保存時に実行する関数です、引数や戻り値にルールがあります、下記参照
* 第3引数は渡したい変数のアドレスです、特に用がない場合はNULLを指定してください

```
extern "C" \_\_declspec(dllimport) BOOL RikkyLoadRegister(char \*register\_name, void \*load\_function, void \*param0, void \*reload\_function, void \*param1);

```

RikkyLoadRegister関数はプロジェクトファイルにデータがあれば、一度だけ実行されます
* 第1引数は登録名で、RikkySaveRegisterで登録した名前と同じにしてください
* 第2引数は読み込み時に実行する関数です、引数や戻り値にルールがあります、下記参照
* 第3引数は読み込み時に渡したい変数のアドレスです、特に用がない場合はNULLを指定してください
* 第4引数は再読込時に実行する関数です、不要の場合はNULLを指定してください、引数や戻り値にルールがあります、下記参照
* 第5引数は再読込時に渡したい変数のアドレスです、特に用がない場合はNULLを指定してください
* ここでいう再読込とはF5を押したときではなく、新しくプロジェクトファイルを開いたときのことを意味します
* aviutlのスクリプトで実際に使うdllの関数内で実行してください

RikkySaveRegisterに登録する関数は戻り値がBOOL型で引数がvoid\*型とint\*型とvoid\*\*型の関数です
RikkyLoadRegisterに登録する1つ目の関数は戻り値がBOOL型で引数がvoid\*型とint型とvoid\*\*型の関数です
RikkyLoadRegisterに登録する2つ目の関数は戻り値がvoid型で引数がvoid\*\*型の関数です
* 実行が成功したらTRUE、失敗したらFALSEを戻り値に設定してください

### 例

```
PONIT p;
BOOL save\_func(void \*data, int \*size, void \*\*param);
BOOL load\_func(void \*data, int size, void \*\*param);
void reload\_func(void \*\*param);
BOOL isfirst = 1;
static int aviutl\_no\_kansu(lua\_State \*L){
 int param0 = 10;
 char \*param1 = "test";
 if(isfirst){
 isfirst = 0;
 RikkySaveRegister("rikky\_new\_module", save\_func, &param0);
 //保存するタイミングによっては関数内で宣言した変数は正しく受け渡されないので
 //渡す際はグローバル変数を使うなどしてください
 //基本的にparamはNULLが妥当です
 RikkyLoadRegister("rikky\_new\_module", load\_func, param1, reload\_func, &isfirst);
 //読み込みはその場で実行されるので、保存のときのような心配はいりません
 //再読込の関数は保存同様、実行タイミングはいつになるか不明なのでグローバル変数を渡してください
 }
 p.x = 10;
 p.y = 20;
}
BOOL save\_func(void \*data, int \*size, void \*\*param){
 //aviutlの保存のルールとして2度関数は実行されます
 //1度目は保存するデータのサイズを取得するため
 //2度目はデータをdataに書き込むためです
 //1度目と2度目の判別方法は引数のdataがNULLかどうかです
 //この例の場合は\*(int \*)param[0]は10の値です※ただし例はローカル変数のアドレスを渡しているので実際どうなるかは不明です
 if(data){
 //1回目のサイズに合わてメモリを確保しているので
 //1回目と同じ大きさのデータを引数に書き込んでください
 //\*sizeの値は1回目に代入した数値と同じになります
 memcpy(data, &p, sizeof(POINT);
 }else{
 //必ず保存するサイズを返してください
 \*size = sizeof(POINT);
 }
 return TRUE;
}
BOOL load\_func(void \*data, int size, void \*\*param){
 //プロジェクトファイルにデータがあれば一度実行します
 //dataは保存したデータ内容
 //sizeはデータのサイズ、この例の場合はsizeof(POINT)の数値と同じです
 //この例の場合はparam[0]は"test"の文字列です
 memcpy(&p, data, size);
 return TRUE;
}
void reload\_func(void \*\*param){
 BOOL \*isfirstp = (BOOL \*)param[0];
 \*isfirstp = 1;
 //変数isfistはグローバル変数なので、実際にはこのような手間をかける必要はなく
 //isfirst = 1;
 //とすれば、値は変更できます
 //これはあくまでサンプルです
}

```

* param[1]はEXFUNC \*exfunc、param[2]はvoid \*editpのポインタです
* 保存や読み出しについてはaviutlのSDK内のソースコードを見て参考にしてください

読み込みや再読込は保存データがないと実行されないのでRikkyLoadRegisterだけ実行しても意味がありません