ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 04:52

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2007年2月26日(月) 04:09 
オフライン

登録日時: 2007年2月11日(日) 01:52
記事: 36
お住まい: HYOGO pref.
IWebBrowser2の取得はなんとかできたようなのですが、IFolderViewの取得ができません。
アイコンの表示状態を取得設定したいので
IFolderViewインターフェイスを使って GetCurrentViewModeとSetCurrentViewModeで実装しようと思ったのですが、
イグトランス様のCOMオブジェクト作成のモジュール
http://www.activebasic.com/forum/viewtopic.php?t=774 を使用して、
ProgID = "Shell.Explorer"
ClsID = IID_IFolderView ←自分で定義しました
とすると、HRESULTに&H80004002を返っているようなので、インターフェースをサポートしていないようなんです。

ProgID をそれ以外("Shell.FolderView"とか)にしても、今度はHRESULT = &H80040154でCOMがオブジェクトを作成できないようです。
IFolderViewはXPからサポートしている筈だし、どう考えても Shell.FolderView か Shell.Explorer ぐらいしか
IFolderViewインターフェイスをサポートしていないと思うのですが、どうやったら取得できるようになるのでしょうか?
コード:
hr = CoInitialize(0)
hr = CoGetMalloc(1, pMalloc)
Dim hr As Long
Dim pMalloc As *IMalloc
' <<
Dim WBins As *IWebBrowser2
Dim ProgID_WB As String
Dim ClsID_WB As GUID
ProgID_WB ="Shell.Explorer"		' == {8856F961-340A-11D0-A96B-00C04FD705A2}
hr =egtrGUIDFromString_Str(ProgID_WB, ClsID_WB)
hr =egtrCoCreateInstance_ClsID(ClsID_WB, IID_IWebBrowser2, VarPtr(WBins))
' >>
' hrに0が返る
' <<
Dim FVins As *IFolderView
Dim ProgID_FV As String
Dim ClsID_FV As GUID
ProgID_FV ="Shell.Explorer.2"	' == "Shell.Explorer"
hr =egtrGUIDFromString_Str(ProgID_FV, ClsID_FV)
hr =egtrCoCreateInstance_ClsID(ClsID_FV, IID_IFolderView, VarPtr(FVins))
' >>
' hrに&H80004002(No such interface supported)が返る

pMalloc->Release()
CoUninitialize()
定義の仕方は下記のトピックやブログなどを参考にしました。
http://www.activebasic.com/forum/viewtopic.php?t=1281
http://www.activebasic.com/forum/viewtopic.php?t=1110
http://www.activebasic.com/forum/viewto ... =1076#4806
http://www.noppi.jp/diary/?date=20041220

エラーコード (HRESULT)は下記のサイトを参考にしました。
http://hyons.hp.infoseek.co.jp/ref/hresult.shtml


通報する
ページトップ
投稿記事Posted: 2007年2月27日(火) 14:37 
オフライン

登録日時: 2005年6月04日(土) 10:09
記事: 72
ぱっと見しただけですが、

IWebBrowser2からQueryInterface()経由でIServiceProviderインターフェイスを取得し、
そこからQueryService()経由でIFolderViewインターフェイスを取得するようです。

http://members.jcom.home.ne.jp/toya.hir ... wmode.html
http://forums.belution.com/ja/vc/000/199/44s.shtml


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年3月01日(木) 17:14 
オフライン

登録日時: 2007年2月11日(日) 01:52
記事: 36
お住まい: HYOGO pref.
Tomorrow様、ありがとうございます。
やってみましたが、結局できませんでした。
コード:
Dim pwb As *IWebBrowser2
Dim psp As *IServiceProvider
Dim pfv As *IFolderView
Dim ProgID_WB As String
Dim ClsID_WB As GUID
Dim hr As Long
Dim pMalloc As *IMalloc
hr = CoInitialize(0)
hr = CoGetMalloc(1, pMalloc)
ProgID_WB ="Shell.Explorer"	' = {8856F961-340A-11D0-A96B-00C04FD705A2}
hr =egtrGUIDFromString_Str(ProgID_WB, ClsID_WB)
hr =egtrCoCreateInstance_ClsID(ClsID_WB, IID_IWebBrowser2, VarPtr(pwb))
hr =pwb->QueryInterface(IID_IServiceProvider, VarPtr(psp))
hr =psp->QueryService(IID_IFolderView, IID_IFolderView, VarPtr(pfv))
最後のhrで&H80004005(Unspecified error)が出てしまいます。
IServiceProviderインターフェイスは取得できているんですけどねぇ
ProgID_WBを "InternetExplorer.Application" や "Shell.Explorer.1"にしてもダメでした。
この問題は根が深そうです。


通報する
ページトップ
投稿記事Posted: 2007年3月12日(月) 10:03 
オフライン

登録日時: 2007年2月11日(日) 01:52
記事: 36
お住まい: HYOGO pref.
つまるところ「エクスプローラのインスタンスを取得する」必要があるのだと分かってきて
検索していたら、MSDNでこんなページを付け、これが糸口になって全てが解決しました。
[[Java を使って、実行中の Internet Explorer のインスタンスに接続する方法]]
http://support.microsoft.com/kb/299356/ja

で、ShellWindowsインターフェイスを取得すればいいんだなーと思って調べてみたら
http://www5a.biglobe.ne.jp/~javajava/ar ... ript1.html
>//ShellWindows implements IShellWindows type coclass
>//prid = "SHDocVw.ShellWindows"
>//guid = {9BA05972-F6A8-11CF-A442-00A0C90A8F39}
とあったのでこれを使って
コード:
Dim NumOfWindow As Long		'ウィンドウの数
Dim pShellWin As *IShellWindows		' Explorerのコレクションを取得
Dim pMalloc As *IMalloc			' メモリ確保用
Dim ProgID_WB As String		' プログラムID
Dim ClsID_WB As GUID		' クラスID
Dim hr As Long			' エラーメッセージ取得用
hr = CoInitialize(0)
hr = CoGetMalloc(1, pMalloc)

ProgID_WB ="{9BA05972-F6A8-11CF-A442-00A0C90A8F39}"	' SHDocVw.ShellWindows
hr =egtrGUIDFromString_Str(ProgID_WB, ClsID_WB)
hr =egtrCoCreateInstance_ClsID(ClsID_WB, IID_IShellWindows, VarPtr(pShellWin))
hr =pShellWin->get_Count(NumOfWindow)	' コレクションの数を取得
としたところ、見事取得することができました。
ここからはトントン拍子で、
コード:
'api_Variant.sbp
Type VARIANT	' 128bitのなんでもござれの構造体
	vt As VARTYPE
	wReserved1 As Word
	wReserved2 As Word
	wReserved3 As Word
	Val[ELM(8)] As Byte
End Type

Function SetVariantLong(lpdata As *VARIANT, num As Long)
	' Const VT_I4=3  /** 4-byte signed int. <Long> **/
	lpdata->vt = VT_I4
	memcpy(VarPtr(lpdata->Val),VarPtr(num),4)
End Function
こんな感じで、URL(パス)・ハンドル・表示モードと、欲しい物を全て取得することができるようになりました。
ここまでたどり着くのは相当時間がかかりました。COMはやっぱりむずいです。
同じように、COMで悩んでいる人の力に少しでもなれたらいいと思います。

でもこれ見たら、イグトランス様が言っていたように、ほとんどWSHでやってることとやり方は同じなんですね。
ウィンドウコレクションからアイテムを一つ一つ取得して、そのプロパティを取得する感じ。
あと、IShellWindowsインターフェイスはなぜかMSDNでは見つからなかったんですが、この名前自体は
WSHでCreateObject("Shell.Application").Windowsというのがあるので、なんか似ているなあと…
案外最初にWSHでプログラムを作っておくと、COMの理解がしやすいのかも。

ref.開いているフォルダウィンドウのアドレスの取得について
http://www.activebasic.com/forum/viewto ... highlight=


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Semrush [Bot] & ゲスト[18人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean