質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

新規のレジストリ項目を追加したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 584

cpp_beginner

score 13

いつもお世話になっております。

VS2017 のセットアッププロジェクトで作成したドライバのインストーラにて、ターゲットPC(Windows10 64-bit) に
ドライバをインストールする際に、同時に新規のレジストリ項目を追加したいのですが、方法がわかりません。
レジストリを追加したい場所は、x86 用の [HKEY_LOCAL_MACHINE]-[SOFTWARE] の下階層になります。

~追記ここから~ (2019/04/22 16:15)
申し訳ございません。実現したい内容が不明瞭でした。以下に追加で列記させていただきます。
・Windows10 64-bit PCに、32-bit ドライバをインストールするセットアッププロジェクトを作成したい。
・インストール時に、自動的に、レジストリファイルもインポートしたい。
(KEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node 配下に新規のレジストリを追加したい)
~追記ここまで~

試してみたことは、以下の通りです。

  1. VS2017 のソリューションエクスプローラ窓にて、セットアッププロジェクトを選択し、
    上部アイコンの レジストリエディタ をクリックし、レジストリ窓を開く。
  2. レジストリ窓の最上部の Registry on Target Machine を右クリックし、インポートを選択。
    追加したいレジストリファイルを選択し、[開く]押下。
  3. レジストリ窓にて、追加したいレジストリ項目が追加されていることを確認。

※ここで選択したレジストリファイルを、ターゲットPC上のレジストリエディタで直にインポートすると
希望するレジストリが追加されます。

この状態でビルドし、ターゲットマシンにインストールを試してみましたが、追加されていませんでした。
(インストールは、通常と管理者として実行の両方で試しましたが変わりませんでした)

また、セットアッププロジェクトのプロパティで InstallAllUsers 項目を True にして再ビルドし、
インストールを試してみましたが、こちらでもレジストリ追加登録はできませんでした。

解決方法をご存知の方がいらっしゃいましたら、ぜひご教授を宜しくお願い致します。

~追記ここから~ (2019/04/22 16:15)
レジストリファイル抜粋
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\OLEforRetail\ServiceOPOS\POSPrinter]

[HKEY_LOCAL_MACHINE\Software\OLEforRetail\ServiceOPOS\POSPrinter\XXXXXXPRT]
@="SOXXXXXX.LinePrinter.1"
"ServiceObjectVersion"=dword:000F4A2D
"ServiceObjectDescription"="XXXXXX Line Printer OPOS Service Object"
"DeviceDescription"="internal printer"
"DeviceName"="XXXXXXPRT"
"BinaryConversion"=dword:00000000
(中略)
"THREAD_TIMER" = dword:00000005
"STATUS_CHECK_ON_CLAIM"=dword:00000000

[HKEY_LOCAL_MACHINE\Software\OLEforRetail\ServiceOPOS\CashDrawer]

[HKEY_LOCAL_MACHINE\Software\OLEforRetail\ServiceOPOS\CashDrawer\XXXXXXDRW]
@="SOXXXXXX.CashDrawer.1"
"ServiceObjectVersion"=dword:000F4A2D
"ServiceObjectDescription"="XXXXXX Drawer OPOS Service Object"
"DeviceDescription"="Drawer"
"DeviceName"="XXXXXXDRW"
"BinaryConversion"=dword:00000000
(中略)
"STATUS_CHECK_ON_CLAIM"=dword:00000000
"ReverseDrawer" = dword:00000001

~追記ここまで~

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2019/04/22 14:45

    Registry Functions( https://docs.microsoft.com/ja-jp/windows/desktop/SysInfo/registry-functions ) はみましたか?

    キャンセル

  • cpp_beginner

    2019/04/22 16:00

    cateya 様

    ご回答誠に有難うございます。
    ご教授いただいたURLはプログラム内からレジストリを操作する関数群と認識しております。
    今回はレジストリファイルでのインポートになりますので、、、

    ほかになにかお気づきの点がありましたら、再度ご教授をお願い致します。
    宜しくお願い致します。

    キャンセル

  • dodox86

    2019/04/22 16:04 編集

    可能ならば、レジストリにインポートする際に使っているregファイル(テキスト?)を提示してもらえるとより良いです。

    キャンセル

回答 2

checkベストアンサー

+2

開発されているWindowsドライバーがユーザーモードドライバーなのか、カーネルモードドライバーなのか、あるいはフィルタードライバーと呼ばれるものなのかはわかりませんが、いずれにしても64bitカーネルのOSに対して、あらゆる32bitのドライバーをインストールすることは絶対にできません。なぜかというと、そのようにWindowsが作られているからです。

敢えて注意しますと、この様なことはあまりに常識過ぎるため、今では明確に書いてある文献を探すことが難しいのかも知れません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/22 23:10

    ご指摘どうもありがとうございます。何か違和感を感じていたのですが、レジストリの方に意識が行っているあまり、もっとも基本的なところを失念しておりました。

    キャンセル

  • 2019/04/23 09:52

    ahidaka 様
    ご回答いただき誠に有難うございます。
    なにぶん当方、Windowsでのドライバ開発というものがほぼ初めてでありまして
    Windowsの知識に関しましては、まったくの素人の域であります。

    当方が行いたいことは、Windows 10 (64-bit) platform 上で、x86 (32-bit)用アプリを
    動作させるための、x86 (32-bit) ドライバ(.ocx、.dll) をインストールすることです。
    64-bit platform上でも、アプリは \Program Files (x86) フォルダ配下に、
    ドライバは \Windows\SysWOW64 フォルダ配下にインストールすることで
    リダイレクト機能というもので、実現可能と認識しておりました。
    ドライバはCOMドライバと呼ばれているもので、Active-Xが関係する(?)ため、
    32-bit版しか作成できないとの認識でした。
    (この認識自体が間違っているのかもしれません)

    ahidaka様がおっしゃられた、ユーザーモード/カーネルモード/フィルターと
    ドライバの種類においても、どのような定義で切り分けられているのかさえも
    認識できておらぬ状況で、お恥ずかしい限りでございます。
    話しが逸れてしまい恐縮ですが、Windowsドライバにはデジタル署名の添付が
    必要とのことで、ドライバ種類の切り分けも知識として必要性を感じています。
    不躾で申し訳ございませんが、これらの知識を習得するために熟読・参考にすべき
    ものがございましたら、ご教授いただけますと幸いでございます。

    宜しくお願い致します。

    キャンセル

  • 2019/04/23 23:11

    申し訳ないのですが、何をされたいのかが良くわかりません。単に「ドライバー」の用語の問題だけかも知れませんが、なぜ、どの様な目的でレジストリを設定しようとしているのかが分からないのです。

    一般的にはDLLはダイナミックリンクライブラリ、OCXはアクティブXコントロールであり、32bitのアプリケーション用にはやはり32bitのDLLとOCXを用意する必要があります。これはWindowsカーネルと前述のWindowsドライバーとの関係と似ています。違うのは、32bitアプリケーション+32bit OCXまたはDLLの組み合わせは、32bitカーネルの上だけではなく、「何もしなくても」64bitカーネルの上で動作するということです。

    もしも単に32bitのDLLやOCXの事を「ドライバー」と呼んでいるのであれば、一般的な(32bit環境での)DLLのインストール手順で、64bitカーネルにもインストールできます。しかしながらそのDLLやOCXは32bitアプリケーションからしか呼び出すことができません。特にレジストリを設定して何かする話では無いと思うのですが、いかがでしょうか。

    キャンセル

  • 2019/04/24 18:21

    ahidaka 様
    度々のご回答誠に有難う御座います。
    OPOS規格(https://www.microsoft.com/ja-jp/business/industry/)に沿ったプリンタ制御用のドライバを開発しています。
    こちらの規格上、各種設定情報をレジストリに配置する必要があるために、レジストリ設定を試みていた次第です。
    下記でご教授いただいた TargetPlatform の設定を x86 に修正することで希望するレジストリ設定ができるようになりました。
    誠に有難う御座いました。

    キャンセル

+1

64ビット版Windows下で32ビットプログラムがレジストリにアクセスするとき、HKEY_LOCAL_MACHINE\SOFTWAREだとHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下へリダイレクトされます。インストーラー自体も32ビット版でビルドされているであろうから、質問者さんのケースではそれに該当していると思われます。レジストリエディターでHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下を覗いてみてください。

@IT - Windows OS入門:第6回 レジストリのリダイレクトと仮想化およびレジストリ操作ツール

レジストリエディターを直接使ってインポートすると意図通りにインポートできるのは、レジストリエディター(C:\Windows\regedit.exe)自身が64ビットプログラムだからです。

インストールしたいプログラムが32ビットプログラムであれば、例えばHKEY_LOCAL_MACHINE\SOFTWARE\HOGE\にアクセスすると、自動的にHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\HOGEにアクセスしています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/24 18:19

    dodox86 様
    おかげ様で無事解決することができました。
    度々のご助言、誠に有難う御座いました。

    キャンセル

  • 2019/04/24 18:30

    なるほど、TargetPlatform指定だけの違いでしたか。そこは同じと思い込んでしまい、解決を遠回りさせてしまいました。失礼しました。解決に直結したのはahidakaさんのご指摘と回答内容ですので、BAはahidakaさんかな、と思います。(可能ならば変えてください)

    キャンセル

  • 2019/04/25 08:49

    dodox86 様
    BAを変えさせていただきました。
    またの機会にもご教授を宜しくお願い致します。
    誠に有難う御座いました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる