getregstr関数についてNo.06454
#funayuki1 さん 10/09/24 17:08
 
#funayuki1です。

「HKEY_CLASSES_ROOT\Microsoft Internet Mail Message\shell\open\command


上記のレジストリキーの値を読みたくて以下のマクロを組みましたが、
値が返って来ません。

$$SID1="Microsoft Internet Mail Message\\shell\\open\\command";
$$SID2="";
openreg "CLASSESROOT",$$SID1;
$$SID2=getregstr("");
closereg;
message "KEY=" + $$SID1 + ", $$SID2=" + $$SID2;

レジストリエディタで以下の値が格納されている事は確認しています。

"%ProgramFiles%\Outlook Express\msimn.exe" /eml:%1

キーの中にスペースがある影響と考えていますが、対処方法が判りません。
対処方法を教えていただけないでしょうか。

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

[ ]
RE:06454 getregstr関数についてNo.06455
秀丸担当 さん 10/09/24 17:46
 

調べてみたところ、ここの種類はREG_SZというという通常の文字列ではなくて、
REG_EXPAND_SZという特殊な文字列の種類になっているようです。
getregstrではREG_SZの読み込みしか対応していないため読み込みできてません
でした。

REG_EXPAND_SZというのは文字列形式には変わりないのですが、
"%ProgramFiles%"といった文字列を"C:\Progmra Files"などに展開するためにあ
るという意味が含まれているだけのようです。

秀丸エディタ側で修正することで文字列としては取得してしまっても取得そのも
のはできそうです。
ただ"%ProgramFiles%"などを展開して取得するべきかどうかというのは意見が分
かれるところかもしれません。
writeregstrはREG_EXPAND_SZには対応していないので、読んだものをそのまま書
くと不可逆となり、中途半端な対応ではまずいかもしれないです。
やっぱりもし対応するとしたら新しい文法を用意するなどを考えたほうがいいか
もしれないです。
今後のネタにさせていただこうと思います。

現状ではgetregbinary("");して16進数化した文字列を無理矢理文字列に直すと
できるという方法もありますが、面倒かもしれないです。
さらに環境変数%ProgramFiles%の変換はgetenv("ProgmraFiles")で変換するとで
き、けっこう面倒な手順を踏むと現状でもREG_EXPAND_SZの展開までできるには
できるかもしれません。

[ ]
RE:06455 getregstr関数についてNo.06456
h-tom さん 10/09/24 22:36
 

h-tom です。

Ver.8からは、COMが使えるので、WSHあたりに任せてもいいのでは?

#WshShell = createobject("WScript.Shell");
if(#WshShell == 0){
    message "オブジェクトの作成に失敗しました。";
    endmacro;
}

$ret1 = callmethod_returnstr(#WshShell, "RegRead", "HKCR\\Microsoft Internet
 Mail Message\\shell\\open\\command\\");
#ret1 = getresultex(10);
if(#ret1 == 0){
    message "RegReadが失敗しました。";
    endmacro;
}
$ret2 = callmethod_returnstr(#WshShell, "ExpandEnvironmentStrings", $ret1);
#ret2 = getresultex(10);
if(#ret2 == 0){
    message "ExpandEnvironmentStringsが失敗しました。";
    endmacro;
}

message $ret1 + "\n" + $ret2;
endmacro;

[ ]
RE:06456 getregstr関数についてNo.06457
#funayuki1 さん 10/09/27 08:32
 
h-tom 殿

#funayuki1 です。

WSHでの対処例、ありがとうございます。
参考にさせていただきます。

以上。

[ ]