そういえば、OSデフォルトのMPEG Decoderがffdshowなどのフィルターより、優先度が低くて正常に動作しない場合の対処方法として、「Microsoft MPEG Video Decoder」などのメリット値を上げるという方法が紹介されているところもあるようですが、
やめた方が良いです
OSのデフォルトのフィルターには手を加えるべきではありません。
まぁ、試してみれば解ると思いますが、アプリケーションによってはMPEGが再生できなくなったりします。
(逆に何の問題もない場合もありますが。)
そのアプリケーションのフィルターの探し方に問題があるような気もしますけど、とりあえず言えるのは、OSのコンポーネントには手を加えるべきではありません。
こういう場合なら、後でインストールしたffdshowの優先度を下げる方法で対処するのがベターというか定石です。
幸い、ffdshowは設定ダイアログでメリット値の変更を許可していますし、
(ffdshowは如何なるメリット値でも動作するように作られているらしい…という予測は出来ますよね)
OSから初めにインストールされている物はアプリケーションによってはそこに在るべき物として既に組み込まれてしまっている可能性があるということを考慮すべきです。
(勿論、本来であればDirectShow FilterはCOMコンポーネントなので、絶対にあるという保証はないので、このようなアプリケーションの組み込み方が間違っているのではありますが。)
ぇ、なんでこんなこと書いてるかって?
テックジャイアン買って、とあるホームページを見に行ったらそんなことが書いてあったからw
そんな、OSに付いてる大本をいじるなんて、プログラマーとして正気かっ!?、と言いたくもなります。
昨日の続き。
…続いちゃうの!?とか言わないでくださいw
/clrコンパイルオプションを外してコンパイルするのはDLLのエントリポイントですから、
COMコンポーネントDLLの場合だと以下の関数が該当すると思います。
・DllMain
・DllCanUnloadNow
・DllGetClassObject
・DllRegisterServer
・DllUnregisterServer
これらを1つのCPPファイルに書いてしまえば言い訳ですね。
書き書き…
のーみそコネコネ、コンパイルしてみよーw
というか、ぷよまん食べたくなったよ…もう、売ってないけど…
Σ(´Д`lll)エラーデタw
COMのインターフェース内にマネージオブジェクトを埋め込んでいるのですが、
オブジェクトマップの関係上、そのインターフェイス定義をインクルードしなくてはなりません。
BEGIN_OBJECT_MAP(WMPSyncPlgComMap) OBJECT_ENTRY(CLSID_WMPSyncPlg, clsWMPSyncPlgInterface) END_OBJECT_MAP() extern "C" bool __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: ComModule.Init(WMPSyncPlgComMap, hInstance); break; case DLL_PROCESS_DETACH: ComModule.Term(); break; } return true; }
こんな感じでDllMainで初期化のために参照されるため、clsWMPSyncPlgInterfaceクラス定義内に、
class ATL_NO_VTABLE clsWMPSyncPlgInterface: public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<clsWMPSyncPlgInterface, &CLSID_WMPSyncPlg>, public IWMPPluginUI { // // 途中かなり省略 // private: CComPtr<IWMPCore> m_ptrWMPCore; gcroot<iriverWMPSyncPlugin::frmMain ^> m_objfrmMain; // ここでハンドルオブジェクトを定義できない };
上記のように、マネージオブジェクトを配置することが出来ないようです…
仕方ありませんので、汎用的な(void *)などで置き換えておいてみました。
そして、実際のコーディング部分でこのポインタ部分にgcroot<>テンプレートを割り当ててみます。
clsWMPSyncPlgInterface::clsWMPSyncPlgInterface(void) { System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::MTA; m_ptrWMPCore = NULL; m_ptrfrmMainGCRoot = new gcroot<iriverWMPSyncPlugin::frmMain^>; *(gcroot<iriverWMPSyncPlugin::frmMain^> *)m_ptrfrmMainGCRoot = nullptr; }
お、コンパイルも通り、実行が出来ました。
ヘッダ部分は、マネージ・アンマネージ両方から参照できるように作っておくと良いようです。
さてと、なんだか本当にこれで良いのか!?
…と思ったら、System.Runtime.InteropServicesが結構怪しいですね。
なんか、属性を付けるだけでCOMアプリケーションからアクセスできそうな予感w
今までのは何だったんだ!?
…これが試行錯誤くおりてぃ(まて
なぜだか真剣な記事もたまには良いですよね。
WMP Sync Pluginをバージョンアップして、コードを書き直しているのですが、
Windows Media Playerはアンマネージのアプリケーションです。
そこから呼び出されるプラグイン内でマネージコードを使用しているのですが、
.NET Framework 1.1から.NET Framework 2.0に移行するにあたり、
この混在アセンブリの初期化部分等が改善されているみたいです。
従来では、_vcclrit.hをインクルードして、
__crt_dll_initialize()
などを使用して手動でマネージ部分の初期化を行っていました。
外部から呼ばれる関数全てにこの初期化、
解放関数をばらまかなくてはならないようで、COMのDLLだと、
・DllCanUnloadNow
・DllGetClassObject
・DllRegisterServer
・DllUnregisterServer
の上記の関数を変更する必要があり、はっきり言って面倒でした…
(まだ4関数だから良いっていえばまだいいですけど)
.NET Framework 2.0ではこれらの関数は不要になり、
DLLがロードされたときに自動的に初期化等を行うようになっているようです。
外部から呼び出されるアンマネージ関数は別ファイルにしておいて、
/clrオプションをファイル単位で外してコンパイルするようです。
うわ、書いてて眠くなった。。。次は明日にしよう…
おやすみー。
ちなみに管理人の独自調査(試行錯誤とも言う)の結果ですので内容は保証しません!
とはいっても、今秋にでるCanvas2 DVD Editionのことではなく、
Canvas2 TVアニメのDVDのこと。
いやぁ、買ったはよいものの、積んであったので、
この3連休で1巻から5巻まで制覇♪
連休とは良い物ですね(ぇ
MK8007GAHがT・ZONEで予約受付をしていました。
とうとう、一般市場へ出回ってきたようです!
H340が80GBになる日が来ました!(w
販売価格は\26800程度だったかと思います。
かなり惹かれている私がここにいます(w
メモリを新しく買ってきました。
SanMaxのDDR400 1GB x 2枚です。
チップはInfineon CE-5。
なんとなくオーバークロックはスマートじゃないので、
(すっごく個人的なただの偏見ですね)
電圧、クロックは定格のままで低レイテンシ化に挑戦してみました。
詰めて行ったところ、こんな感じになりました。
Clock : 200MHz(定格) CL : 2 tRCD : 3 tRP : 3 tRAS : 6 tRRD : 2 tRC : 7 tRFC : 12 tRWT : 2
以下の設定でもMemtest86は完走するのですが…
Clock : 200MHz(定格) CL : 2 tRCD : 3 tRP : 2 tRAS : 5 tRRD : 2 tRC : 7 tRFC : 12 tRWT : 2
再起動するたびにCMOS設定が初期化されるという…
メモリテストで引っかかってるのかなぁw
とまぁ、2GBになってVistaは快適になりました。
いやっほい♪
Amazon.co.jpのランキングとかすごいことになってますね。
DVDセールスランキングががががw
でも、TSUTAYAとかだと全然出てこないですね(笑
さすが、Amazon.co.jp。おた多しw
あぁ、愛しの給料日まであと少し。
今週は秋葉に行ってメモリを買ってくるとしますか…
さて、では昨日のgigabeatをどうやればお金を捻出できるか、考えてみることにします。
まず、今月の予約済みで買わなくてはお店に迷惑をかけてしまうものw
両方あわせて、2万弱ぐらいですか…
つぎー、PCのメモリが片方お亡くなりになったので、買い換えないとまずーなので、
(Windows Vistaがスワップしまくりで激重です。このOS、1GBはメモリ必須ですね。)
・DDR400(PC3200) 1GB CL3 x 2
こちらも2万弱ぐらいですが、生きている片方のメモリを売って足しにしましょう。
錬金術は大切ですよw
えと、次に今月に狙っているタイトルw
・メイドさんと大きな剣
・おしえて Re:メイド
・はぴねす!りらっくす 初回限定版
・ぶらばん!
えっと、正直なところ無理だろ…っていう塩梅になってきました…
あと、愛しのオーディオテクニカからATH-CM7の後継機が出ました。
…絶望的ですね。
ということでこんなことに30分を費やす、ダメな管理人でありましたとさ。