cadencii_jp @ wiki
VOCALOID1のSynthesize Engine 1.0と1.1の同時起動
最終更新:
boare
-
view
事前に知っておくと良い事柄
- VOCALOID1 VSTi DLLの本体(vocaloid.dll)は,VOCALOID Editorのインストールディレクトリにある設定ファイル「VOCALOID.ini」の,[Synthesis]セクションのDSEVersionの項目を読み取って,Synthesize Engineを切り替える.DSEVersion=100なら1.0, DSEVersion=101なら1.1.
- vocaloid.dllがVOCALOID.iniを読みにいくのは,dllのエントリーポイントであるDllMainが最初に呼ばれたときだけである(推測).
- 同一プロセスから2回目以降にLoadLibraryEx(WinAPI関数)でvocaloid.dllを読み込んだ場合,DllMainは呼ばれない.
- VOCALOID.iniは,UAC(ユーザーアカウント制御)がデフォルトの設定のとき,書き込み制限がかかる.
Cadenciiの動作詳細
2種類のSynthesize Engineを読み込ませる場合における,Cadenciiの動作の詳細を時系列順に説明します.
- vocaloid.dllをLoadLibraryExを用い読み込む.ここでは,VOCALOID.iniに記述されたデフォルトのSynthesize Engineで読み込まれる.
- VOCALOID.iniを,一時ディレクトリにコピーし,バックアップを取る.
- VOCALOID.iniのDSEVersionの項目を,デフォルトと違う値に書き換える.(DSEVersion=100 -> 101, DSEVersion=101 -> 100)
- vocaloid.dllを,Kenji Aiko氏によるDLL読み込み方法で読み込む.この方法で読み込むと,vocaloid.dllのディレクトリは同じであるにもかかわらず,別のdllとして読み込まれるため,エントリーポイントDllMainが実行される.
- バックアップしておいたVOCALOID.iniを,元の位置に戻す.
まとめと備考
- vocaloid.dllを通常の手法で単純に2回読み込むのではなく,別々のDLLとして読み込む.すると,2回の読み込みでそれぞれ1回ずつDllMainが実行されるので,違うDSEVersionで起動することができる.
- VOCALOID.iniを操作する必要があるので,UACを無効にしておく必要がある.
- Windows 7の場合,LoadLibraryExを介さずにDLL読み込んで実行しようとすると,データ実行防止(DEP)機能により,UAC無効の場合であってもメモリアクセス違反が発生する.これを回避するために,Cadenciiの本体であるCadencii.exeに,「アセンブリがDEPに対応していない」ことを表すフラグを立てる必要がある.具体的には,Microsoft Visual Studioのツールセットに入っている「editbin.exe」を使って,次のコマンドを実行する.
editbin /NXCOMPAT:NO Cadencii.exe