- PR -

SWTによるレジストリ操作

1
投稿者投稿内容
van
会議室デビュー日: 2007/09/09
投稿数: 2
投稿日時: 2007-09-09 01:08
はじめまして
いつも本サイト参考にさせていただいております。

厚かましいとは思いますが、質問することを許してください。

JavaからWindowsレジストリの操作を行うプログラムを作成したいと思い、色々とテストや調査をしてきました。

http://homepage2.nifty.com/igat/igapyon/diary/2005/ig051228.html
上記のサイトにあるように、どうやらSWTを使用してレジストリにアクセスできるということがわかり、さっそくサイトのサンプルを参考にレジストリの値を取得するサンプルも作成することができました。

しかし、ここで問題点が2点。

・上記サイトのサンプルを拝借したプログラムではREG_SZの値は取得できるものの、REG_DWORDが取得できません。

・レジストリの新規作成や、レジストリ値の更新等の方法が不明

どちらの問題も、SWTのwin32APIに関する情報が極めて少ない(私の調査の甘さ、英語解読が苦手等、至らない点も十分ありますが)ため、どなたかご教授いただければと思います。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-09-09 13:04
質問の直接の回答ではないことを前置きしておきます。

REG_DWORDが取得できません。
 できなかったあなたのコードを提示してください

型の対応
取得時はBYTEのようなので変換する必要があるのでは?
サンプルにあるコードとWIN32APIの対応を後述しています

レジストリの新規作成や、レジストリ値の更新等の方法が不明
 WIN32APIを先に調べてください

msdn.microsoft.com/library/ja/jpsysinf/html/Toppage_Registry.asp

RegCreateKeyEx
指定されたレジストリ キーを作成します
RegQueryValueEx
開いているレジストリ キーに関連付けられている指定された値の種類とデータを取得します。
RegSetValueEx
レジストリ キーの下にある指定された値のデータと種類を設定します

rc = OS.RegQueryValueEx(hKey[0], new TCHAR(OS.CP_INSTALLED,
"Version", true), 0, null, buf, len);

LONG RegQueryValueEx(
HKEY hKey, // キーのハンドル
LPCTSTR lpValueName, // レジストリエントリ名
LPDWORD lpReserved, // 予約済み
LPDWORD lpType, // データ型が格納されるバッファ
LPBYTE lpData, // データが格納されるバッファ
LPDWORD lpcbData // データバッファのサイズ
);

lpData
1 個のバッファへのポインタを指定します。
関数から制御が返ると、このバッファに、レジストリエントリのデータが格納されます

lpcbData
lpData パラメータで指定したバッファのサイズをバイト単位で保持している、1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、lpData バッファへコピーされたデータのサイズが格納されます。
データ型が REG_SZ、REG_MULTI_SZ、REG_EXPAND_SZ のいずれかである場合、終端の NULL が含まれます


[ メッセージ編集済み 編集者: 99ri 編集日時 2007-09-09 13:15 ]
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-09-10 23:02
スレッドを起こした方はもうみないと思いますが実験してみました

REG_DWORDの場合
OS.RegQueryValueExの第5引数をTCHARでなくint[] にします
第5引数のint[0]に値が設定され返却されます

レジストリの新規作成や、レジストリ値の更新等の方法が不明
実装していないようです
WIN32APIと一致するメソッド名がありません



[ メッセージ編集済み 編集者: 99ri 編集日時 2007-09-10 23:09 ]
van
会議室デビュー日: 2007/09/09
投稿数: 2
投稿日時: 2007-09-10 23:15
返事遅くなり、本当に申し訳ありませんでした。

99ri様、大変参考になるご返事ばかりか、実験までしていただき、
このような私を助けていただき、本当に感謝でいっぱいです。

今日一日WIN32APIを読み、レジストリの新規作成、更新をテストしておりましたが、やはりできませんでした。

REG_DWORDの件、一度試させていただきます。
その結果も書かせていただきます。

明日もう一度WIN32APIを隅々まで調べて、レジストリ新規作成、更新を調べてみます。
99ri様、本当にありがとうございます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-09-11 08:53
試したことはないのですが、JNI 共有スタブ が利用できるかもしれません。JNI って呼び出したいネイティブ関数ごとにラッパーを書かないといけないと思っていたんですが、実はそうでもないらしいですね。

引用:

JNI API の拡張機能
・共有スタブは、多数の C 関数にディスパッチ可能な単一の JNI ネイティブメソッドです。



ほかにも有償製品として、J/Invoke なんてものもあるようです。使ったことないですけど。
1

スキルアップ/キャリアアップ(JOB@IT)