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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3109閲覧

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

cpp_beginner

総合スコア17

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/22 02:33

編集2019/04/22 07:29

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

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

~追記ここまで~

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cpp_beginner

2019/04/22 07:00

cateya 様 ご回答誠に有難うございます。 ご教授いただいたURLはプログラム内からレジストリを操作する関数群と認識しております。 今回はレジストリファイルでのインポートになりますので、、、 ほかになにかお気づきの点がありましたら、再度ご教授をお願い致します。 宜しくお願い致します。
dodox86

2019/04/22 07:04 編集

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

回答2

0

ベストアンサー

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

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

投稿2019/04/22 13:59

ahidaka

総合スコア391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/04/22 14:10

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

2019/04/23 00: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ドライバにはデジタル署名の添付が 必要とのことで、ドライバ種類の切り分けも知識として必要性を感じています。 不躾で申し訳ございませんが、これらの知識を習得するために熟読・参考にすべき ものがございましたら、ご教授いただけますと幸いでございます。 宜しくお願い致します。
ahidaka

2019/04/23 14: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アプリケーションからしか呼び出すことができません。特にレジストリを設定して何かする話では無いと思うのですが、いかがでしょうか。
cpp_beginner

2019/04/24 09:21

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

0

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/22 06:40

編集2019/04/22 06:41
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cpp_beginner

2019/04/22 06:54

dodox86 様 ご回答誠に有難う御座います。 ご指摘いただいた通り、インストールするのは32ビット版のドライバです。 しかしながら、ターゲットPC(Windows10 64-bit)にてインストール実行後、regedt.exe を開き、 HKEY_LOCAL_MACHINE\SOFTWARE 配下および、HKEY_LOCAL_MACHINE\SOFTWARE\WOWSYS6432Node 配下を確認しても、 期待するレジストリの追加がされなていないのです。 念のため、%windir%\syswow64\regedit.exe でも確認しましたが、追加はされていませんでした。 セットアッププロジェクトでの設定方法に不備/不足があるのではと考えておりますが、 どこを確認すれば良いか、知識不足のため不明なのです。 説明不足でしたが、レジストリエディタを使って直接インポートするときは、 %windir%\syswow64\regedit.exe を使用していました。 セットアッププロジェクトにインポートする場合は、レジストリファイルの記述に違いがあるのでしょうか? さらにお気づきのことなどありましたら、ご教授いただけると幸いです。 宜しくお願い致します。
dodox86

2019/04/22 07:02

そうですと最終的にやりたいことが現段階で少し不明瞭ですが、「インストールするのは32ビットのデバイスドライバー」「64ビット版Windows下ではHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nodeにレジストリエントリを作成したい」「32ビット版Windows下ではHKEY_LOCAL_MACHINE\SOFTWARE下にレジストリエントリを作成したい」と言うことであっていますか?質問に追記するかたちで記述してもらえますでしょうか。
cpp_beginner

2019/04/22 07:30

dodox86 様 度々のご回答誠に有難うございます。 質問事項に追記を致しました。 ご教授宜しくお願い致します。
dodox86

2019/04/22 08:52

情報の追記、どうもありがとうございます。ご提示のregファイルの内容で「(中略)」部分を削除したものでインポートし、試してみましたが、現状、正常にレジストリに追加されて問題は見受けられませんね。cpp_beginnerさんとはどこか環境が違うようです。(Win7, Win10それぞれの64ビット版で試しました) 思いつく限りですが: 1. レジストリをインポートするだけのセットアッププロジェクトを作成して試してみる。(私はこの方法で試しています) 2. Visual Studio の更新をしてみる。(当方のはVisual Studio 2017 15.9.10です)セットアッププロジェクトに関して何かしら不具合があるのかもしれません。 3. HKEY_CURRENT_USER下で試してみる。 4. 試されているマシンは、ActiveDirectoryの管理下にあったりしませんか?グループポリシーで何かHKEY_LOCAL_MACHINE下を触れないような適用がされているとかありませんか? 5. リアルタイムで防除をするセキュリティソフトがインストールされていたりはしませんか? 6. デバイスドライバー自体はインストールされているのでしょうか。レジストリだけが書き込まれない?
dodox86

2019/04/22 09:04

ちなみに私が使っているセットアッププロジェクトは、Visual Studio 2017のメニュー「拡張機能と更新プログラム」からインストールして使えるようにしたものです。 "Microsoft Visual Studio Installer Projects" (バージョン0.9.2)と表示されます。
cpp_beginner

2019/04/22 10:54

dodox86 様 度々のご回答誠に有難う御座います。 当方の環境は、VS2017(ver15.9.9)です。 セットアッププロジェクトのversionはどこを確認すれば良いのかわかりませんでした。 ターゲットPCは、Windows10 Enterprise 2016 LTSB (ver.1607) になります。 また、ActiveDirectoryの管理下ということもないと思います。 (申し訳ありません、ActiveDirectoryというものをきちんと理解できておりませんが、  ターゲットマシンは単体でネットワーク接続をしていない状態ですので違うと思います) セキュリティソフトも入れておりません。 ドライバはインストールできております。 (ターゲットPC上でのregeditにて直接インポート後に、ドライバ動作は確認できております) dodox86 様のセットアッププロジェクトのプロパティで、TargetPlatform 項は x86 でしょうか? x64 でしょうか? 申し訳ありません。ただいま、当方のVS2017の挙動がおかしくなってしまい、 既存のどのプロジェクトを読み込んでも Some of the priorities associated with the solution could not be read. とエラーが発生する状態になってしまいました。 本件が解消するまで、こちらでのご返事が遅くなるかもしれません。 ご理解いただけますと幸いです。 引き続きご教授のほど、宜しくお願い致します。
dodox86

2019/04/22 13:38 編集

cpp_beginner さんとほぼ同じ環境のようですね。問題無さそうに思いますが。。。ちなみに当方のテストしたWin.10は、Professional 64ビット ver.1709 (OS ビルド16299.309)です。セットアッププロジェクトのTargetPlatformプロパティは x86 (Releaseビルド)です。 > セットアッププロジェクトのversionはどこを確認すれば良いのかわかりませんでした。 Visual Studio の上部メニュー「ツール(T)」-->「拡張機能と更新プログラム(U)...」で「インストール済み」「すべて」で検索すると「Microsoft Visual Studio Installer Project」を見つけることができ、インストール日とバージョンが確認できます。(Visual Studio 自体のインストーラーでインストールした環境では違うのかもしれません。>ここはちょっと分かりません) > 本件が解消するまで、こちらでのご返事が遅くなるかもしれません。 いえいえ、当方が困っている訳ではないので大丈夫です。cpp_beginnerさんのご都合で作業をお進めください。
dodox86

2019/04/22 14:39

別途ahidakaさんの回答よりご指摘があったように、最終的に求めるところのセットアッププログラムとしては、64ビットWindowsにおいて32ビット用ドライバーをインストールするというのは不適切だと改めて思います。インストール先のWindowsが32ビット版か64ビット版かでインストールするものを切り替えるか、多くはインストーラー自体を32ビット用、64ビット用とで分けます。セットアップのプロジェクトで造ったインストーラーがレジストリに書き込めるかどうかは別の話として問題の切り分けをした方が良いかと思います。(※尚、ここで申し上げるのは筋違いなのは承知の上ですが、ahidakaさんはその会社様の名前と共に、特にデバイスドライバー周りの情報と開発ノウハウでは日本では恐らく知らない人は居ないだろうと思われる方です。私も以前より存じていましたが、大変失礼しました)
cpp_beginner

2019/04/23 00:53

dodox86 様 度々のご回答誠に有難うございます。 当方が行いたいことは、(ahidaka様への返信にも記したとおり) > 当方が行いたいことは、Windows 10 (64-bit) platform 上で、x86 (32-bit)用アプリを > 動作させるための、x86 (32-bit) ドライバ(.ocx、.dll) をインストールすることです。 > 64-bit platform上でも、アプリは \Program Files (x86) フォルダ配下に、 > ドライバは \Windows\SysWOW64 フォルダ配下にインストールすることで > リダイレクト機能というもので、実現可能と認識しておりました。 となっており、こちらにて質問させていただいているインストーラも Windows 10 (64-bit) platform へのインストールだけを考えております。 ※Windows 7/8/8.1 64-bit platform および、windows 32-bit platform への  対応は別と思っております。 実際、ドライバは x86 用としてビルドしており、ターゲットPCへのインストールで \Windows\SysWOW64 フォルダ配下に格納されていることは確認ずみです。 セットアッププロジェクトで、インストール先をSystem Folderにしたことで リダイレクト機能で上記フォルダに格納されております。 当方の認識に問題がありましたら、ご指摘いただけますと幸いです。 当方のビルド環境ですが、インストーラプロジェクトは Version: 0.9.2 でした。 また、セットアッププロジェクトのビルド設定は、 Solution Configuration: Release Solution Platforms: x86 Properties - TargetPlatform: x64 としていました。 このTargetPlatformプロパティが x64 なのが問題かもしれません。 VS2017環境を復旧させたのち、試してみたいと思います。 引き続き、ご教授のほど宜しくお願い申し上げます。
ahidaka

2019/04/23 14:18

Target Platformはx86にして下さい。何も特別な設定をせずに、純粋な(x86)32bit Windows様に作られたものだけが、SysWow64での動作対象となります。
cpp_beginner

2019/04/24 09:17

ahidaka 様 ご教授有難う御座います。 ご教授いただいた通り、TargetPlatform の設定を x86 に修正することで希望するレジストリ設定ができました。 大変助かりました。有難う御座いました。
cpp_beginner

2019/04/24 09:19

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

2019/04/24 09:30

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

2019/04/24 23:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問