HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1030
HSPで64ビットの整数を扱う方法3解決


リンク

2017/10/30(Mon) 20:19:49|NO.81736

 こんにちは、何度もすみません。

 レジストリに0XFFFFFFFEや0XFFFFFFFFの数値を書き込む必要があり、試してみたんですが、HSPで扱える数値の範囲を超えているらしく、正常な値を書き込むことができません。
 なお、書き込もうとしているレジストリは、Windowsの設定となるため、値を2つに分けて書き込むというようなことができない状況です。
 また、longint.dllでlongint型に変換して、書き込みに挑戦してみましたが、文字列として書き込まれてしまいました。
 本当はCとかでプログラムを書ければいいんですが、いい情報が見つからず、HSPで何とかできないものかと考えている状態です。
 上のような状態なんですが、何かいい方法はありますでしょうか。
 ちなみに、レジストリへの書き込みは、下記のモジュールを利用しています。

http://www.placeark.com/program_hsp_sample_file/SAMPLE_registrymodule.zip

 以上、よろしくお願いいたします。



この記事に返信する


3k

リンク

2017/10/30(Mon) 21:14:44|NO.81737

見たところ、0xFFFFFFFEや0xFFFFFFFFなどの数値は4バイトに収まるので、HSPのintにギリギリ収まると思います。
試しに下記のようなスクリプトを書き実行してみましたが、正常に値が書き込まれているようです。


#include "registrymodule.hsp" key = "HKEY_CURRENT_USER\\Software\\TestSoftware\\TestValue" dialog strf("今から下記のレジストリに書き込みします、よろしいですか?\n%s", key), 3 if ( stat == 7 ) : end v = 0xffffffff regwrite key, v ts = "失敗" if ( stat ) : ts = "成功" dialog "書き込みました\n"+ts end
(※注意 レジストリに書き込みレジストリを汚すので、レジストリを弄って直せる方以外は実行非推奨です)

ただ、書き込む時はDWORDつまりunsinged intなので、signed intであるHSPのint型とは値の解釈が異なります。
例えば、「4294967295」(DWORDでの0xffffffff)という値は、HSPでは「-1」(signed intでの0xffffffff)になります。

QWORDでの書き込みになるのかなと思ったのですが、具体例が4バイトだったのでそうでもないんだろうなと思い直しつつ…。
より具体的にダメなケースをご提示頂くか、今一度書き込み処理を整理して下さい。



3k

リンク

2017/10/30(Mon) 21:25:32|NO.81738

…と書き込んだはいいものの、質問に質問で返すと手返しが悪くなるので、的外れかもしれませんがQWORDでの書き込みについても一応付記しておきます。
64ビット整数を生で扱うことは現状のHSPではできないですが、32ビット整数を2つ使えば表現力は64ビット同じなので、32ビット2つ受け取って64ビットとしてレジストリに書き込むサンプルです。

モジュールに下記のコードを追加してください。(追加するのは#globalの直前ですね)

#define REG_QWORD 0x0000000b /** 指定したキーにデータ(QWORD)を書き込みます。キーがない場合は作成します。 @param key キー名 @param hiword 書き込むデータ上位4バイト @param loword 書き込むデータ下位4バイト @return 1で成功,0で失敗 */ #deffunc regwriteq str key,int hiword,int loword,local hkey,local subkey,local valuename,local handle,local flag,local datatype,local ldata hkey = getHKeyByKey(key) subkey = getSubKeyByKey(key) valuename = getValueNameByKey(key) if((hkey==0)||(subkey=="")||(valuename=="")) { return 0 } handle = 0 flag = RegCreateKeyExA(hkey,varptr(subkey),0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,varptr(handle),NULL) if(flag!=ERROR_SUCCESS) { return 0 } dim ldata, 2 ldata(0) = loword ldata(1) = hiword flag = RegSetValueExA(handle,varptr(valuename),NULL,REG_QWORD,varptr(ldata),8) datatype = RegCloseKey(handle) if(flag!=ERROR_SUCCESS) { return 0 }else { return 1 }

テスト実行のコードは下記です。

#include "registrymodule.hsp" key = "HKEY_CURRENT_USER\\Software\\TestSoftware\\TestValueQ" dialog strf("今から下記のレジストリに書き込みします、よろしいですか?\n%s", key), 3 if ( stat == 7 ) : end // キー名、上位4バイト、下位4バイト regwriteq key, 0x01234567, 0x89abcdef ts = "失敗" if ( stat ) : ts = "成功" dialog "書き込みました\n"+ts end



リンク

2017/10/30(Mon) 21:57:32|NO.81740

 こんばんは、お世話になります。

 あれ、本当ですね。
 先ほど再挑戦したところ、すんなり書き込まれました。
 なんだったんだろう。
 とりあえず、できたので解決とします。

 それから、QWORDで書き込むサンプルもありがとうございます。
 何かの際には使わせていただきます。

 ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.