VBAの参照設定でDLLの場所がおかしい

VBからDirectShowを使うやり方を書いた「DirectShow for Visual Basic」というページを見つけたので、VBAで試すことにした。

DirectShow にアクセスするためのコントロールが用意されています、それが Quarts.dll です。これを使う際には Visual Basic の [プロジェクト] → [参照設定…] で 「ActiveMovie control type library」 をチェックしてください。
DirectShow for Visual Basic

さっそく「ActiveMovie control type library」(実体はquartz.dll)を参照設定しようとすると…

[quartz.dll読み込みでエラー]

へ??

もう一度、参照設定ウインドウを開いてよく見ると…

[DLLの場所がドキュメントフォルダになっている]

なんでDLLがドキュメントフォルダにあるんだ??

実際にあるのか確認するが、やっぱりドキュメントフォルダになんかなくて、「C:\Windows\System32」(と「C:\Windows\SysWOW64」)にちゃんとある。つまり、嘘っぱちのパスが表示されてるわけで、そりゃそのまま登録しようとしたらエラーになるわ。

とりあえず再登録できないかと「regsvr32」したが効果なし。しかたないのでレジストリを直接いじることにした。

レジストリを検索して「HKEY_CLASSES_ROOT\TypeLib」の「quartz.dll」の登録を見ると、ファイル名しか入っていない。

[レジストリにはファイル名しか入っていなかった]

付近のキーを見たら「%SystemRoot%\System32\」とちゃんとパスが入っているので、これが原因らしい。

キーにアクセス制限がかかっているのでまずアクセス権を変更してからパスを入力した。

[%SystemRoot%\System32\を追加]

で、再び参照設定ウインドウを開くと…

[ドキュメントフォルダのパスに繋がってしまった]

なんでーーー!? ドキュメントフォルダのパスの下にさっき入力したのがそのまま繋がっていた…。環境変数理解してくれないの…?さっき見たキーのは環境変数使ってたのに、なんでquartz.dllのキーは駄目なの…。

[今度はちゃんとパスを記入]

しかたないので、フルパスをちゃんと入力。今度こそ…

[無事、正しいパスになった]

ε-(´∀`*)ホッ

正しいパスになって、無事登録できました。レジストリのアクセス権を元に戻して作業完了。

しかし、なんでquartz.dllのパスの登録がファイル名だけになってたんだろ…?検索しても何もヒットしなかったので、他の人はこんな目には合ってないらしい。俺何かしたかな…?さっぱり思い出せん。

コメント

  1. 匿名 より:

    こんにちは
    上記と同じ現象に困りこちらにたどり着きましたが、regsvr32もレジストリの修正も試しましたが解決に至らず困っています。

    • ひょうろくだまらん より:

      こんにちは。
      >上記と同じ現象
      というのは
      「参照設定ウインドウで表示されるDLLの場所がおかしい」
      ということでいいのでしょうか。
      その場合、レジストリを操作しても治らないとなると、自分に思いつくのは以下の2点くらいです。

      1. タイプライブラリのUUID({長い文字列})は合っているでしょうか?
        • このブログの画像にあるUUIDは「ActiveMovie control type library」のものです。
        • ライブラリの名前でレジストリ内を検索して正しいサブキーを見つけてください。
      2. タイプライブラリのレジストリキーには32bit用のものもあります。
        • 「HKEY_CLASSES_ROOT\Wow6432Node\TypeLib」以下にも同様のキーがあります。
        • こちらの内容はどうなっているでしょうか。

      参照設定ウインドウで表示されるDLLの場所は正しいのに
      「DLL 読み込み時のエラーです」が表示されるのだとしたら、
      このブログで書いている内容とは別の原因ということになります。
      こちら↓はチェックされたでしょうか。
      DLL 読み込み時のエラーです (エラー 48)