none
64bitOSのSystem32フォルダ下に置いたCOMが「参照の追加」で見えない RRS feed

  • 質問

  • お世話になっております。

    環境はWindows7の64bit版で、VisualStudio2010で、VC++で作成したCOMを、VBで参照しようとしているのですが、参照できずに困っています。

    手順としては以下です。

    1.VC++で64bit版COM(OCXファイル)を作成

    2.%SystemRoot%\System32フォルダ下に1のocxファイルを置き、regsvr32コマンドで登録

    3.VBでアプリを作成し、メニューバーの「プロジェクト」-「参照の追加」-「COM」タブで参照するが、表示されず

    試したことを以下に記載します。

    ・[参照]タブで直接ファイルを指定しようとしたのですが、ダイアログでSystem32を開くと、SysWOW64フォルダにリダイレクトされてしまい、

    直接指定できませんでした。

    ・ほかのフォルダ(C:\temp)などを作成し、そこにCOMファイルを置き、登録すると参照できました。

    ・VisualStudio2010を管理者権限で起動して「参照の追加」を見てみましたが、同じく表示されませんでした。

     

    System32フォルダ下は見えないのかと思いましたが、私の環境で、すでに登録されている、例えば「AccessibilityCpl.dll」や「HelpPaneProxy.dll」など、

    ほかにも多くのSystem32フォルダ直下のファイルは見えています。

    どのようにすれば参照できるようになるのでしょうか?

    2010年10月5日 1:45

回答

  • Visual Studio 自体が x86 プロセスなので、x64 COM を参照することができないというのは既に出ているとおりです。

    COM を参照設定する代わりに、tlbimp.exe を使って相互運用アセンブリを作成すれば問題を回避できるかと思われます。
    http://msdn.microsoft.com/ja-jp/library/tt0cf3sx.aspx

    (Visual Studio の IDE は GUI からこの相互運用アセンブリを生成し、参照設定しているだけです。コマンドベースでも作れます)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 編集済み AzuleanMVP, Moderator 2010年10月6日 14:26 tlbexp にリンクしていたので tlbimp に変更。
    • 回答の候補に設定 山本春海 2010年10月12日 5:34
    • 回答としてマーク 山本春海 2010年12月8日 6:20
    2010年10月5日 14:17
    モデレータ
  • >の回答から、「VB版」=32bitと回答されているように感じてしまい、少々混乱しています。

    申し訳ございません、誤解していました。64bit版の開発をされているのですね。

    >VBでも64bit版は作成できると思うのですが、違うのでしょうか?

    作成できます。混乱させてしまい申し訳ございませんでした。

    >今回私が質問したのは、「64bit版VBアプリから、system32フォルダ下の64bit版のcomを参照する方法」となります

    IDEから表示できない理由は、IDE(devenv.exe *32)が32bitアプリだからです。表示の際にはSysWow64へリダイレクトされてしまっています。
    64bit版と32bit版の両方を作成して登録しておくと、コンパイル時や実行時にはどちらもC:\Windows\System32として動いてくれるので、64bit版を64bit版のregsvr32で32bit版を32bit版のregsvr32で両方登録してみてください。

    「Regsvr32 の使用法とエラー メッセージについて」
    http://support.microsoft.com/kb/249873/ja

    ところで、COMでしたら、正常に登録されていれば、ProgIDを使ってCOMタブから参照できるはずなのですが、64bit版regsvr32.exeで何かエラーは出ていませんでしたか?
    64bit版のregeditを使用してHKCR以下にProgIDは登録されていて、リンクされているCLSIDにあるパスも正しく設定されていますか?
    #むしろ32版を実行させる方が面倒なので、64bit版で正常に登録されているものと存じますが念のため

    重ねて、誤解して混乱させてしまったことをお詫び申し上げます。

    • 回答の候補に設定 山本春海 2010年10月12日 5:34
    • 回答としてマーク 山本春海 2010年12月8日 6:19
    2010年10月5日 12:42

すべての返信

  • >「AccessibilityCpl.dll」や「HelpPaneProxy.dll」など、

    フォルダ内をよく見てみると、これらのDLLはSysWOW64以下に32bit版が用意されています。

    DLLが、他のbit幅のプロセス内に入れない(参照できない)のは仕様です。
    ですので、VBで利用なのであれば、別途32bit版を用意してください。

    違うアプローチとしては、COM Server(Exe形式)として作成してください。

    2010年10月5日 3:27
  • chukiさん、回答ありがとうございます。

    ただ、せっかく回答をいただいたのですが、意味がよくわからなくて・・・

    >フォルダ内をよく見てみると、これらのDLLはSysWOW64以下に32bit版が用意されています。

    >DLLが、他のbit幅のプロセス内に入れない(参照できない)のは仕様です。
    と書かれていますが、これはsystem32フォルダにも、sysWOW64フォルダにもあります。

    「参照の追加」の「COM」タブを見てみると、SysWOW64フォルダにあるものは、

    きちんとパスにC:\Windows\SysWOW64\XXX.dllなどと表示されています。

    ということは、ここに表示されている「AccessibilityCpl.dll」や「HelpPaneProxy.dll」は

    64bit版のsytem32フォルダ下の方なのではないでしょうか?

     

    >VBで利用なのであれば、別途32bit版を用意してください

    こちらは、「VB版は64bit版のsystem32下のフォルダにはアクセスできないから、32bit版でアクセスする」という意味に

    とらえたのですが、合ってますでしょうか?とすると、VBでは64bitでCOMにアクセスするアプリはsystem32フォルダにはCOMを置けないということになるのでしょうか?その場合、それは仕様ということになると思いますが、

    もし情報ソースをお持ちでしたら、アドレスなど教えていただけないでしょうか。

    よろしくお願いいたします。

    2010年10月5日 4:30
  • >きちんとパスにC:\Windows\SysWOW64\XXX.dllなどと表示されています。

    これは、32bit用です。
    System32以下にあるものは64bit用です。32bitアプリを動かす時には、SysWOW64がsystem32のようにはアプリから見える仕組みになってみます。この混乱しそうな仕組みをWoWといいます。詳しくはWoWでお調べください。

    >こちらは、「VB版は64bit版のsystem32下のフォルダにはアクセスできないから、32bit版でアクセスする」という意味にとらえたのですが、合ってますでしょうか?

    あってます。32bitアプリからはsystem32と指定したものが実際にはSysWOW64を指します。この仕組みで、64bitOS上で32bitアプリが動かせています。

    >VBでは64bitでCOMにアクセスするアプリはsystem32フォルダにはCOMを置けないということになるのでしょうか?

    System32は32とついているのに基本的に64bitアプリからしかアクセスできません。また、残念ながら、32bitアプリであるVisual Basic 6のアプリから64bitのDLLは呼び出せません。

    「32 bit アプリケーションを 64 bit 環境 (WOW64) に移植する際のシステムファイル / レジストリの扱いについて - 松崎 剛 Blog - Site Home - MSDN Blogs」
    http://blogs.msdn.com/b/tsmatsuz/archive/2009/04/16/64-bit-wow-32bit-system-file-registry.aspx

     

    2010年10月5日 5:55
  • chukiさん、回答ありがとうございます。

    どうもうまく伝わっていないようなので、一度整理します。

    ・COMは64bit版を作成

    ・VB版アプリも64bit版(正確にはAnyCPUでビルド)を作成

     →そのため、SysWoW64フォルダではなく、system32フォルダを見ているはずです。

     

    chukiさんは、「32bit版アプリはsystem32フォルダからSysWow64フォルダへリダイレクトされる」と

    返信いただいたものと理解しております。

    今回私が質問したのは、「64bit版VBアプリから、system32フォルダ下の64bit版のcomを参照する方法」となります。

    以上となるため、

    >>こちらは、「VB版は64bit版のsystem32下のフォルダにはアクセスできないから、32bit版でアクセスする」という

    >>意味にとらえたのですが、合ってますでしょうか?

    >あってます。

    この回答から、「VB版」=32bitと回答されているように感じてしまい、少々混乱しています。

    VBでも64bit版は作成できると思うのですが、違うのでしょうか?

    2010年10月5日 6:21
  • >の回答から、「VB版」=32bitと回答されているように感じてしまい、少々混乱しています。

    申し訳ございません、誤解していました。64bit版の開発をされているのですね。

    >VBでも64bit版は作成できると思うのですが、違うのでしょうか?

    作成できます。混乱させてしまい申し訳ございませんでした。

    >今回私が質問したのは、「64bit版VBアプリから、system32フォルダ下の64bit版のcomを参照する方法」となります

    IDEから表示できない理由は、IDE(devenv.exe *32)が32bitアプリだからです。表示の際にはSysWow64へリダイレクトされてしまっています。
    64bit版と32bit版の両方を作成して登録しておくと、コンパイル時や実行時にはどちらもC:\Windows\System32として動いてくれるので、64bit版を64bit版のregsvr32で32bit版を32bit版のregsvr32で両方登録してみてください。

    「Regsvr32 の使用法とエラー メッセージについて」
    http://support.microsoft.com/kb/249873/ja

    ところで、COMでしたら、正常に登録されていれば、ProgIDを使ってCOMタブから参照できるはずなのですが、64bit版regsvr32.exeで何かエラーは出ていませんでしたか?
    64bit版のregeditを使用してHKCR以下にProgIDは登録されていて、リンクされているCLSIDにあるパスも正しく設定されていますか?
    #むしろ32版を実行させる方が面倒なので、64bit版で正常に登録されているものと存じますが念のため

    重ねて、誤解して混乱させてしまったことをお詫び申し上げます。

    • 回答の候補に設定 山本春海 2010年10月12日 5:34
    • 回答としてマーク 山本春海 2010年12月8日 6:19
    2010年10月5日 12:42
  • Visual Studio 自体が x86 プロセスなので、x64 COM を参照することができないというのは既に出ているとおりです。

    COM を参照設定する代わりに、tlbimp.exe を使って相互運用アセンブリを作成すれば問題を回避できるかと思われます。
    http://msdn.microsoft.com/ja-jp/library/tt0cf3sx.aspx

    (Visual Studio の IDE は GUI からこの相互運用アセンブリを生成し、参照設定しているだけです。コマンドベースでも作れます)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 編集済み AzuleanMVP, Moderator 2010年10月6日 14:26 tlbexp にリンクしていたので tlbimp に変更。
    • 回答の候補に設定 山本春海 2010年10月12日 5:34
    • 回答としてマーク 山本春海 2010年12月8日 6:20
    2010年10月5日 14:17
    モデレータ
  • Chukiさん、Azuleanさん回答ありがとうございます。

    >Chukiさん

    >重ねて、誤解して混乱させてしまったことをお詫び申し上げます。

    気になさらないでください。こちらこそ回答いただいて大変助かっております。

    >64bit版を64bit版のregsvr32で32bit版を32bit版のregsvr32で両方登録してみてください。

    試してみたところ、確かに両方見えることが確認できました。

    ただ、必須ではないのですが、64bit版はファイル名に「x64」とつけるように、現在は仕様で決めております。

    例えば、32bit版が「Sample.ocx」だとすると、「SampleX64.ocx」のような感じです。

    こうしてしまうと、ファイル名が違うので、やはり見えなくなってしまいました。

    方法がなければ、ファイル名を同じにすることも視野に入れてみようと思います。

    >64bit版regsvr32.exeで何かエラーは出ていませんでしたか

    特にエラーはでませんでした。一応レジストリも確認してみましたが、ProgIDもパスも正しく設定されています。

    regsvr32を実行する際にタスクマネージャを確認し、64bit版のregsvr32が実行されていることも確認しましたので、

    合っていると思います。

    >Azuleanさん

    tlbimp.exe は初めて聞きました。まだざっと読んだだけですが、OCXファイルビルドの際に「.tlb」ファイルが

    作成されています。アプリケーションビルド時に、これにリンクさせればいいというわけですね。

    方法が見つからなければ、こちらも検討してみます。

    ※ちょっと難易度が高そうですね。

    引き続き、ファイル名が異なる場合でも参照できないか、情報をお待ちしております。

    2010年10月6日 3:26