レジストリ
hiraさんのOrangeArchiverのソースコードの一部を抜粋。
(起動時)
レジストリに登録されているか調べる
↓
if 登録されているか。
登録されているなら(Then)
無視して次の作業を継続
登録されていないなら(Else)
レジストリに登録
EndIf
といった流れだったと思います。適切なコメントもついているようなのでじっくり見ていけば書けると思います。
hiraさんへ。
勝手に引用してすみませんでした。
[ここをクリックすると内容が表示されます]
まぁやりたい事はMainwnd.sbpの2399Line
その他
コード: 全て選択
Sub MainWnd_IDM_SETEXT_MenuClick()
Dim hKey As Long,hExtKey As Long,Ret As DWord,AppFile As String,AppFile2 As String
Dim FileType As String,FileTypeLen As DWord
Dim hSubKey[2] As Long
'関連付けはされているか?
RegCreateKeyEx(HKEY_CLASSES_ROOT,"OrangeArchiverFile",0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY,ByVal NULL,hKey,VarPtr(Ret))
If Ret=REG_CREATED_NEW_KEY Then
'関連付けはされていない
'OrangeArchiverFile[既定]
RegSetValueEx(hKey,"",0,REG_SZ,"OrangeArchiver 書庫ファイル",28)
'OrangeArchiverFile\DefaultIcon[既定]
RegCreateKeyEx(hKey,"DefaultIcon",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,ByVal NULL,hSubKey[0],NULL)
AppFile=ZeroString(MAX_PATH)
GetModuleFileName(0,AppFile,MAX_PATH)
'長いファイル名に戻す
AppFile2=ZeroString(MAX_PATH)
GetLongPathName(AppFile,AppFile2,MAX_PATH)
AppFile=MakeStr(AppFile2)
RegSetValueEx(hSubKey[0],"",0,REG_SZ,AppFile & ",4",Len(AppFile)+3)
RegCloseKey(hSubKey[0])
'OrangeArchiverFile\shell
RegCreateKeyEx(hKey,"shell",0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY,ByVal NULL,hSubKey[0],NULL)
'OrangeArchiverFile\shell\open
RegCreateKeyEx(hSubKey[0],"open",0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY,ByVal NULL,hSubKey[1],NULL)
'OrangeArchiverFile\shell\open\command[既定]
RegCreateKeyEx(hSubKey[1],"command",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,ByVal NULL,hSubKey[2],NULL)
RegSetValueEx(hSubKey[2],"",0,REG_SZ,AppFile & Ex" \q%1\q",Len(AppFile)+6)
RegCloseKey(hSubKey[2])
RegCloseKey(hSubKey[1])
RegCloseKey(hSubKey[0])
RegCreateKeyEx(HKEY_CLASSES_ROOT,".oar",0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE Or KEY_SET_VALUE,ByVal NULL,hExtKey,VarPtr(Ret))
If Ret=REG_CREATED_NEW_KEY Then
'.oarに何も関連付けられていない
RegSetValueEx(hExtKey,"",0,REG_SZ,"OrangeArchiverFile",28)
RegCloseKey(hExtKey)
Else
'.oarに関連付けられたアプリケーションがある
RegQueryValueEx(hExtKey,"",0,NULL,NULL,VarPtr(FileTypeLen))
FileType=ZeroString(FileTypeLen)
RegQueryValueEx(hExtKey,"",0,NULL,FileType,VarPtr(FileTypeLen))
RegSetValueEx(hExtKey,"",0,REG_SZ,"OrangeArchiverFile",28)
RegCloseKey(hExtKey)
RegSetValueEx(hKey,"",0,REG_SZ,"OrangeArchiver 書庫ファイル",28)
RegSetValueEx(hKey,"OldExt",0,REG_SZ,FileType,lstrlen(FileType)+1)
RegCloseKey(hKey)
End If
MsgBox hMainWnd,Ex"[.oar]をOrangeArchiverに関連付けました。\r\nもし[.oar]ファイルを直接開けない場合は、Windowsを再起動してください。","関連付けの設定",MB_ICONINFORMATION
Else
RegCreateKeyEx(HKEY_CLASSES_ROOT,".oar",0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE Or KEY_SET_VALUE,ByVal NULL,hExtKey,NULL)
'関連付けがされている
If RegQueryValueEx(hKey,"OldExt",0,NULL,NULL,VarPtr(FileTypeLen))=ERROR_SUCCESS Then
FileType=ZeroString(FileTypeLen)
RegQueryValueEx(hKey,"OldExt",0,NULL,FileType,VarPtr(FileTypeLen))
RegCreateKeyEx(HKEY_CLASSES_ROOT,".oar",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,ByVal NULL,hExtKey,NULL)
RegSetValueEx(hExtKey,"",0,REG_SZ,FileType,lstrlen(FileType)+1)
RegCloseKey(hExtKey)
Else
'元々関連付けられたアプリケーションはない。
RegCloseKey(hExtKey)
RegDeleteKey(HKEY_CLASSES_ROOT,".oar")
End If
RegDeleteKey(hKey,"shell\open\command")
RegDeleteKey(hKey,"shell\open")
RegDeleteKey(hKey,"shell")
RegDeleteKey(hKey,"DefaultIcon")
RegCloseKey(hKey)
RegDeleteKey(HKEY_CLASSES_ROOT,"OrangeArchiverFile")
MsgBox hMainWnd,Ex"[.oar]への関連付けを解除しました。","関連付けの解除",MB_ICONINFORMATION
End If
RefreshExt()
End Sub
コード: 全て選択
'短いファイル名(8+3)を長いファイル名に変換する関数
Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" (lpszShortPath As String,lpszLongPath As String,cchBuffer As Long) As Long
(起動時)
レジストリに登録されているか調べる
↓
if 登録されているか。
登録されているなら(Then)
無視して次の作業を継続
登録されていないなら(Else)
レジストリに登録
EndIf
といった流れだったと思います。適切なコメントもついているようなのでじっくり見ていけば書けると思います。
hiraさんへ。
勝手に引用してすみませんでした。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
いえいえ、ソースを用意しているのはそうやって利用して頂くためでもあるので(と私は思っているのですが)。
※konisiさん提示のOrangeArchiverのコードは、過去関連付けされていたアプリケーションもレジストリで管理しています。
そのため普通は関連付けに関係ない "OldExt" なんてものを勝手に作ってます(爆) 関連付け解除時にはちゃんと消すようにしていますが。
※konisiさん提示のOrangeArchiverのコードは、過去関連付けされていたアプリケーションもレジストリで管理しています。
そのため普通は関連付けに関係ない "OldExt" なんてものを勝手に作ってます(爆) 関連付け解除時にはちゃんと消すようにしていますが。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
返信ありがとうございます。
早速、そのままでテストのつもりで、コピー&ペーストしてコンパイルしてみましたが、エラーが出ました。なぜなのでしょうか?
何か、コードの書き忘れが考えられるのですが、どうでしょう?
早速、そのままでテストのつもりで、コピー&ペーストしてコンパイルしてみましたが、エラーが出ました。なぜなのでしょうか?
何か、コードの書き忘れが考えられるのですが、どうでしょう?
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" 無効な識別子です
サブルーチン
このコードを追加すれば大丈夫だと思います。
コード: 全て選択
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
すみません、konisiさんの提示されたコードは現在のABでエラーになってしまいます(エラーの内容を読んで気づきました)。
それから、RefreshExt()関数はOrangeArchiver側で関連付けがされているかどうかを判断してメニューに反映するものですから、関連付けをすること自体に必要なものではありません。呼び出し部分も含めて削除してくださって結構です(GTRさんのプログラムでそのような機能を付けたい場合はRefreshExt()の中身を改造して対応してください)。
と変更すればうまく動くようになります(以前はLongで動いていたんですけどね^^;)。Dim hSubKey[2] As HKEY
それから、RefreshExt()関数はOrangeArchiver側で関連付けがされているかどうかを判断してメニューに反映するものですから、関連付けをすること自体に必要なものではありません。呼び出し部分も含めて削除してくださって結構です(GTRさんのプログラムでそのような機能を付けたい場合はRefreshExt()の中身を改造して対応してください)。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
改造を行いました。しかし、やはりまだ何か出るようです。
4.23.00を使っています。
それと、コード内に書かれているDefaultIconというのは何なのでしょうか?違うアイコンをつけたい場合はどうすればよいでしょう?
なぜなのか良くわかりませんが、以前投稿した中でも、ActiveBasic本体のバージョンと合っていないような気がします。だから一応言っておきます。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型に変換できません
4.23.00を使っています。
それと、コード内に書かれているDefaultIconというのは何なのでしょうか?違うアイコンをつけたい場合はどうすればよいでしょう?
修正し忘れがありました。
それから、「DefaultIcon」ですが、これは登録した拡張子に関連付けるアイコン…すなわちその拡張子のファイルを表すアイコンです。
使うアイコンは
ここの部分で操作できます。
AppFile はEXEファイルの名前(フルパス)、",4" はEXEファイルに含まれるアイコンの番号を示しています(最初のアイコンが0となります)。
例えばここの第5引数を
とすれば、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]
:(以下略)
こんな感じです。
ここもです。失礼しました。hExtKey As HKEY
それから、「DefaultIcon」ですが、これは登録した拡張子に関連付けるアイコン…すなわちその拡張子のファイルを表すアイコンです。
使うアイコンは
コード: 全て選択
RegSetValueEx(hSubKey[0],"",0,REG_SZ,AppFile & ",4",Len(AppFile)+3)
AppFile はEXEファイルの名前(フルパス)、",4" はEXEファイルに含まれるアイコンの番号を示しています(最初のアイコンが0となります)。
例えばここの第5引数を
コード: 全て選択
AppFile & ",10"
どの番号が何のアイコンなのか調べるには、
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]
:(以下略)
こんな感じです。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
返信ありがとうございました。
やはり修正してみてもダメです。
いろいろ、Dim命令のところを変えてみているのですが、よくわかりません。
やはり修正してみてもダメです。
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命令のところを変えてみているのですが、よくわかりません。
いっそのこと、旧版のActiveBasicのコンパイラ使ったほうが早かったのかな?といまさらながら思案してみた今日この頃です。
でも昔は今のようなZip形式ではなく自己解凍形式だったので、それはそれで少し厄介かなと思ったりもしますが。
でも昔は今のようなZip形式ではなく自己解凍形式だったので、それはそれで少し厄介かなと思ったりもしますが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ファイルをダブルクリックし、関連付けられたアプリケーションが開かれた場合、
そのアプリケーション側に渡されたコマンドラインからそのファイル名を取得することができます。
コマンドライン文字列の取得は GetCommandLine() です。
スペースで区切られたパラメータの1つ目は自分自身のファイル名、2つ目以降はダブルクリックなどが行われたファイルを指します。
つまりこれでファイル名の取得は可能ですが、"" で括られたファイル名の扱いに注意してください("" 内にあるスペースで切ると誤動作します)。
そのアプリケーション側に渡されたコマンドラインからそのファイル名を取得することができます。
コマンドライン文字列の取得は GetCommandLine() です。
スペースで区切られたパラメータの1つ目は自分自身のファイル名、2つ目以降はダブルクリックなどが行われたファイルを指します。
つまりこれでファイル名の取得は可能ですが、"" で括られたファイル名の扱いに注意してください("" 内にあるスペースで切ると誤動作します)。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/