none
64ビットWindowsでVB6を使用する RRS feed

  • 質問

  • 32ビット環境で開発されたVB6アプリケーションを64ビット環境へ移植したいのですが、アプリケーションを動作させる為に特殊なハードウェアが必要です。32ビットアプリを64ビット環境で動作させるにはWOW64を使用すればよいということはわかっていますが、ハードウェアのデバイスドライバーについてはどう考えればよいのでしょうか?ハードウェアとしては、IOレジスタを複数本保持しており、それらをリードライトすることで外界の信号(具体的にはアナログ信号)をアプリ内部に取り込むような構成となっています。64ビットOSには64ビットデバイスドライバーが必要という話もあり、WOW64ではデバイスドライバーについて処理できないという話もあり、方向性が見えなくなってきています。初心者ですが、宜しくお願いします。

    2016年12月8日 14:50

回答

  • WOW64 で動かす場合においても、ドライバーは 64bit である必要があります。
    多くの場合、64bit のドライバーで、特に修正もなく、32bit のソフトウェアを動かすことができます。
    64bit のドライバーの作りによるかもしれませんが。

    一般論として言えるのはこのくらいだと思います。
    これ以上は、踏み込んだ質問をされるか、そういうことに詳しい業者と組むかといったことを考えてください。


    -----
    https://blogs.msdn.microsoft.com/jpwdkblog/2009/06/24/64/
    • 編集済み AzuleanMVP, Moderator 2016年12月8日 21:35
    • 回答としてマーク hayax 2016年12月13日 2:54
    • 回答としてマークされていない hayax 2016年12月13日 3:27
    • 回答としてマーク hayax 2016年12月13日 6:51
    2016年12月8日 21:33
    モデレータ
  • まず、64bit Windows における System32 は 64bit プロセス向け DLL を、SysWOW64 には 32bit プロセス向けの DLL を配置することになります。
    また、VB6 のアプリケーションは 32bit プロセスですから、64bit ドライバーに対応する、32bit の DLL を作成・配置しなければなりません。
    32bit プロセスは 32bit の DLL だけ、64bit のプロセスは 64bit の DLL だけが読み込める仕様だからです。

    ブルースクリーンになるのは、64bit ドライバーが 32bit プロセスを考慮していないという可能性が考えられます。
    具体的な問題についてはそのドライバーについてわからないことと、私自身はドライバー開発者ではないので答えられませんが…。
    (フォーラムで解決は難しいのではないかと思います。64bit Windows における開発経験がない状態では Web ベースのコミュニケーションのハードルが高すぎると思うので…)

    2016年12月13日 12:49
    モデレータ

すべての返信

  • WOW64 で動かす場合においても、ドライバーは 64bit である必要があります。
    多くの場合、64bit のドライバーで、特に修正もなく、32bit のソフトウェアを動かすことができます。
    64bit のドライバーの作りによるかもしれませんが。

    一般論として言えるのはこのくらいだと思います。
    これ以上は、踏み込んだ質問をされるか、そういうことに詳しい業者と組むかといったことを考えてください。


    -----
    https://blogs.msdn.microsoft.com/jpwdkblog/2009/06/24/64/
    • 編集済み AzuleanMVP, Moderator 2016年12月8日 21:35
    • 回答としてマーク hayax 2016年12月13日 2:54
    • 回答としてマークされていない hayax 2016年12月13日 3:27
    • 回答としてマーク hayax 2016年12月13日 6:51
    2016年12月8日 21:33
    モデレータ
  • 早速のご回答ありがとうございます。正にこのような鳥羽口の情報を探しきれず逡巡しておりました。早速教えて頂いた情報を元に検討をはじめたいと思います。
    2016年12月9日 0:26
  • このようなフォーラムの利用は初めてなので、マナー違反になってしまっているかも知れないのですが、引き続いて教えて頂きたい事が出てきました。

    infファイルを編集して、デバイスマネージャで見た場合、これまでの64ビット用エントリの他に”SYSWOW64”サブエントリの中に必要なDLLが登録された状態までたどり着く事ができました。この状態で、実際のファイルを検索すると”System32”フォルダの中には上記のDLLがインストールされていますが、”SYSWOW64"サブフォルダ内には実体がインストールされていない状態です。この状態で"Program Files (X86)"フォルダ内にコピーしたこのハードウェアを操作する32ビットアプリを起動すると、”システムに必要なDLLが存在しないので、再度インストールが必要”というメッセージが現れてアプリの終了を求められます。また、”SYSWOW64"フォルダに手動でこれらのDLLをコピーしておいて同じ操作をすると、”DLL”が無いというメッセージは表示されませんが、その代わり”アプリケーションを正しく起動できませんでした。(0xc000007b)”というメッセージが表示されます。これらを総合的に考えると、32ビットアプリからアクセスされた64ビットDLLは専用の何らかの戻り値を返し、その事で、”SYSWOW64"フォルダに必要なDLLがコピーされるという流れなのではないかと思われます。過去にそのような情報を見たような記憶もあるのですが、改めて探すとなると、なかなか情報にたどり着けません。何か有用な情報がありましたらご教授いただけると幸いです。宜しくお願いいたします。

    2016年12月13日 4:07
  • 質問文から状況が想像できませんでしたので、直接的な回答ではありませんが、
    WOW64は"Windows 32-bit On Windows 64-bit"の略称であり、64bitバイナリがWOW64にコピーされることはないはずです。
    WOW64配下のモジュールを使用するのであれば、そのモジュールも32bitバイナリである必要があるのではないでしょうか。
    2016年12月13日 5:10
  • フォーラム オペレーターの栗下 望です。
    hayax さん、ご投稿ありがとうございます。

    フォーラムは情報を探す場所でもありますので、
    一つのスレッドとタイトルは一致させていただければと思います。

    お手数ですが今後、追加のご質問をされる際は新しくスレッドを作成ください。

    質問自体が解決した場合は、
    [回答としてマーク]を参考になった返信におつけいただければと思います。

    今後ともよろしくお願いいたします。


    MSDN/TechNet Community Support 栗下 望


    2016年12月13日 5:26
    モデレータ
  • 最初私もそう考えて、32ビットのDLLをSYSWOW64にコピーして32ビットアプリ(このDLLを使用するアプリ)を起動したところ、まさかのブルースクリーンになってしまいました。実際のところは、このフォルダに32ビットのDLLをコピーするわけではなく、SYSTEM32フォルダにインストールされている64ビットDLLが32ビットアプリに対して適切に対応する事で正常に動作するようになるのでしょうが、現在のところそこまで到達できていないので、透過的に64ビットDLLをコピーする事で32ビットアプリからDLLが認識できているのではないかと考えています。(もちろん最終的にはそのような形ではなくSYSTEM32フォルダの64ビットDLLが適切に動作するという事になるのだと考えています。)
    2016年12月13日 11:57
  • まず、64bit Windows における System32 は 64bit プロセス向け DLL を、SysWOW64 には 32bit プロセス向けの DLL を配置することになります。
    また、VB6 のアプリケーションは 32bit プロセスですから、64bit ドライバーに対応する、32bit の DLL を作成・配置しなければなりません。
    32bit プロセスは 32bit の DLL だけ、64bit のプロセスは 64bit の DLL だけが読み込める仕様だからです。

    ブルースクリーンになるのは、64bit ドライバーが 32bit プロセスを考慮していないという可能性が考えられます。
    具体的な問題についてはそのドライバーについてわからないことと、私自身はドライバー開発者ではないので答えられませんが…。
    (フォーラムで解決は難しいのではないかと思います。64bit Windows における開発経験がない状態では Web ベースのコミュニケーションのハードルが高すぎると思うので…)

    2016年12月13日 12:49
    モデレータ
  • わかりにくい質問にもかかわらず、ご回答いただきありがとうございます。Webで色々と調べてみたところ、抽象データモデル(LLP64)という概念に辿り着くことができました。そこで書かれている内容(ポインター型の精度のみが32ビットと64ビットとで異なる)が、最初に返信いただいた内容(64ビットドライバーで32ビットアプリを動作させることができるはず)のベースになっているのですね。恐らく現在作成しているドライバーがその点について無頓着なコーディングになっているのだと思います。もう一度初心に帰ってコーディングを見直したいと思います。本当にありがとうございました。
    2016年12月13日 15:33