ページ 13

レジストリ

Posted: 2006年3月23日(木) 19:50
by GTR
プロジェクトエディターのように、始めて起動したときに、レジストリ(拡張子)を登録できるようにしたいのですが、どのようなコードを書けば良いでしょうか?
調べてみたのですが、よくわかりません。

開発環境は次のとおりです。

WindowsXP Professional SP2

Posted: 2006年3月23日(木) 22:09
by konisi
hiraさんのOrangeArchiverのソースコードの一部を抜粋。 まぁやりたい事は
(起動時)
レジストリに登録されているか調べる

if 登録されているか。
  登録されているなら(Then)
    無視して次の作業を継続
  登録されていないなら(Else)
    レジストリに登録
EndIf

といった流れだったと思います。適切なコメントもついているようなのでじっくり見ていけば書けると思います。

hiraさんへ。
勝手に引用してすみませんでした。

Posted: 2006年3月23日(木) 22:29
by hira
いえいえ、ソースを用意しているのはそうやって利用して頂くためでもあるので(と私は思っているのですが)。
※konisiさん提示のOrangeArchiverのコードは、過去関連付けされていたアプリケーションもレジストリで管理しています。
そのため普通は関連付けに関係ない "OldExt" なんてものを勝手に作ってます(爆) 関連付け解除時にはちゃんと消すようにしていますが。

Posted: 2006年3月24日(金) 20:05
by GTR
返信ありがとうございます。
早速、そのままでテストのつもりで、コピー&ペーストしてコンパイルしてみましたが、エラーが出ました。なぜなのでしょうか?
何か、コードの書き忘れが考えられるのですが、どうでしょう?
MainWnd.sbp(548) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(554) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(565) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(567) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(569) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(575) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(595) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(601) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(620) - "RefreshExt" 無効な識別子です

サブルーチン

Posted: 2006年3月24日(金) 20:25
by C1000
このコードを追加すれば大丈夫だと思います。

コード: 全て選択


Sub RefreshExt()
Dim hKey As HKEY
Dim udtMenuItemInfo As MENUITEMINFO
	With udtMenuItemInfo
		.cbSize=44
		.fMask=MIIM_STATE

		If RegOpenKeyEx(HKEY_CLASSES_ROOT As HKEY,"OrangeArchiverFile",0,KEY_QUERY_VALUE,hKey)=ERROR_SUCCESS Then
			RegCloseKey(hKey)
			.fState=MFS_CHECKED
		Else
			.fState=MFS_UNCHECKED
		End If
		
		SetMenuItemInfo(hMenu_MAIN_2,IDM_SETEXT,0,udtMenuItemInfo)
	End With
End Sub

Posted: 2006年3月24日(金) 22:45
by GTR
無効な識別子と言うのは消えましたが、まだ、変換できませんというのが出ます。コードを各場所はあってると思うのですが・・・。

Posted: 2006年3月25日(土) 09:55
by hira
すみません、konisiさんの提示されたコードは現在のABでエラーになってしまいます(エラーの内容を読んで気づきました)。
Dim hSubKey[2] As HKEY
と変更すればうまく動くようになります(以前はLongで動いていたんですけどね^^;)。
それから、RefreshExt()関数はOrangeArchiver側で関連付けがされているかどうかを判断してメニューに反映するものですから、関連付けをすること自体に必要なものではありません。呼び出し部分も含めて削除してくださって結構です(GTRさんのプログラムでそのような機能を付けたい場合はRefreshExt()の中身を改造して対応してください)。

Posted: 2006年3月25日(土) 21:51
by GTR
改造を行いました。しかし、やはりまだ何か出るようです。
MainWnd.sbp(566) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(593) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(613) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
MainWnd.sbp(619) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
なぜなのか良くわかりませんが、以前投稿した中でも、ActiveBasic本体のバージョンと合っていないような気がします。だから一応言っておきます。
4.23.00を使っています。
それと、コード内に書かれているDefaultIconというのは何なのでしょうか?違うアイコンをつけたい場合はどうすればよいでしょう?

Posted: 2006年3月25日(土) 23:27
by hira
修正し忘れがありました。
hExtKey As HKEY
ここもです。失礼しました。

それから、「DefaultIcon」ですが、これは登録した拡張子に関連付けるアイコン…すなわちその拡張子のファイルを表すアイコンです。
使うアイコンは

コード: 全て選択

RegSetValueEx(hSubKey[0],"",0,REG_SZ,AppFile & ",4",Len(AppFile)+3)
ここの部分で操作できます。
AppFile はEXEファイルの名前(フルパス)、",4" はEXEファイルに含まれるアイコンの番号を示しています(最初のアイコンが0となります)。
例えばここの第5引数を

コード: 全て選択

AppFile & ",10"
とすれば、11番目のアイコンが使用されます(但し、第6引数は第5引数の文字数[NULL文字を含む]を指定するところであるため、+3 → +4 と変更しなければならなくなりますが)。
どの番号が何のアイコンなのか調べるには、
http://www.vector.co.jp/soft/dl/win95/a ... 01729.html
↑などのソフトを使うと便利です。
このソフトで表示されたリストと番号の対応例(ProjectEditor.exe)を挙げると

アイコン名 [←番号]
114 [←0]
114 [←0]
118 [←1]
131 [←2]
148 [←3]
149 [←4]
151 [←5]
203 [←6]
226 [←7]
226 [←7]
229 [←8]
229 [←8]
:(以下略)

こんな感じです。

Posted: 2006年3月26日(日) 22:28
by GTR
返信ありがとうございました。
やはり修正してみてもダメです。
MainWnd.sbp(566) - RegCreateKeyEx関数の第8パラメータをLong型からVoidPtr型に変換できません
RegCreateKeyEx(HKEY_CLASSES_ROOT,"*",0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY,ByVal NULL,hKey,VarPtr(Ret))
この部分です。*はファイルネーム
いろいろ、Dim命令のところを変えてみているのですが、よくわかりません。

Posted: 2006年3月26日(日) 22:32
by hira
三たび修正忘れが発覚…orz
Dim hKey As HKEY
これで今度こそ動作するはずです。ご迷惑をおかけしましたm(_ _)m

Posted: 2006年3月27日(月) 09:30
by konisi
いっそのこと、旧版のActiveBasicのコンパイラ使ったほうが早かったのかな?といまさらながら思案してみた今日この頃です。

でも昔は今のようなZip形式ではなく自己解凍形式だったので、それはそれで少し厄介かなと思ったりもしますが。

Posted: 2006年3月27日(月) 19:57
by GTR
旧版でやってもよかったと思いますが、ちゃんと今の環境でコンパイル&起動できますので、良かったと思います。
今回はどうもありがとうございました。

Posted: 2006年4月15日(土) 23:05
by GTR
追加機能のお願いをしたいのですが、よろしいでしょうか?
orangearchiverを参考に、拡張子が関連付けられている場合、その関連付けされているファイルのアイコンをダブルクリックすると、その内容を表示するようにしたいのですが、どういう風にすれば良いでしょう?
また、自分はテキストエディターみたいなものを作っています。

Posted: 2006年4月16日(日) 00:02
by hira
ファイルをダブルクリックし、関連付けられたアプリケーションが開かれた場合、
そのアプリケーション側に渡されたコマンドラインからそのファイル名を取得することができます。
コマンドライン文字列の取得は GetCommandLine() です。
スペースで区切られたパラメータの1つ目は自分自身のファイル名、2つ目以降はダブルクリックなどが行われたファイルを指します。
つまりこれでファイル名の取得は可能ですが、"" で括られたファイル名の扱いに注意してください("" 内にあるスペースで切ると誤動作します)。