「VOCALOID1のSynthesize Engine 1.0と1.1の同時起動」の編集履歴(バックアップ)一覧に戻る
VOCALOID1のSynthesize Engine 1.0と1.1の同時起動 - (2010/03/03 (水) 13:14:22) のソース
*事前に知っておくべき事柄 +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読み込み方法(http://ruffnex.oc.to/kenji/text/load_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 ----