レジストリ

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
GTR

レジストリ

#1 投稿記事 by GTR »

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

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

WindowsXP Professional SP2
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

hiraさんのOrangeArchiverのソースコードの一部を抜粋。 まぁやりたい事は
(起動時)
レジストリに登録されているか調べる

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

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

hiraさんへ。
勝手に引用してすみませんでした。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#3 投稿記事 by hira »

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

#4 投稿記事 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" 無効な識別子です
C1000

サブルーチン

#5 投稿記事 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
GTR

#6 投稿記事 by GTR »

無効な識別子と言うのは消えましたが、まだ、変換できませんというのが出ます。コードを各場所はあってると思うのですが・・・。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#7 投稿記事 by hira »

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

#8 投稿記事 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というのは何なのでしょうか?違うアイコンをつけたい場合はどうすればよいでしょう?
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#9 投稿記事 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]
:(以下略)

こんな感じです。
GTR

#10 投稿記事 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命令のところを変えてみているのですが、よくわかりません。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#11 投稿記事 by hira »

三たび修正忘れが発覚…orz
Dim hKey As HKEY
これで今度こそ動作するはずです。ご迷惑をおかけしましたm(_ _)m
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#12 投稿記事 by konisi »

いっそのこと、旧版のActiveBasicのコンパイラ使ったほうが早かったのかな?といまさらながら思案してみた今日この頃です。

でも昔は今のようなZip形式ではなく自己解凍形式だったので、それはそれで少し厄介かなと思ったりもしますが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
GTR

#13 投稿記事 by GTR »

旧版でやってもよかったと思いますが、ちゃんと今の環境でコンパイル&起動できますので、良かったと思います。
今回はどうもありがとうございました。
GTR

#14 投稿記事 by GTR »

追加機能のお願いをしたいのですが、よろしいでしょうか?
orangearchiverを参考に、拡張子が関連付けられている場合、その関連付けされているファイルのアイコンをダブルクリックすると、その内容を表示するようにしたいのですが、どういう風にすれば良いでしょう?
また、自分はテキストエディターみたいなものを作っています。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#15 投稿記事 by hira »

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