いつも困った時などに、参考にさせて頂いております。
さて、このサイトでの質問に適しているか不安ですが…、過去にへろさんの質問で「へろ 2010/02/01(月) 13:04:18 <中級者> hWndを元にInternetExplorerオブジェクトを生成できますか?」(http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+201002/10020001.txt)と同様な事象があり、その解決方法として回答にそって対処しようと考えています。
但し、「参照設定として Edanmo's OLE interfaces & functions v1.81 (OLELIB.TLB)を加える必要。」とあり、このタイプライブラリを社内で使用する際、セキュリティ上、問題ないを説明する必要があります。
初心者以上〜中級者未満のレベルの私には
「過去からVb6などで一般的に使用されて問題は報告。」
ということしか説明する情報がありません。
何方か、ご意見を頂けませんでしょうか。
今回必要な部品がIServiceProviderだから、TLBを
必要とする気持ちは分かります。
しかし、これだけの事ならIUnknown_QueryService関数
ひとつで処理可能ですね。(Shlwapi.dll内)
わざわざ、TLBまで用意して
IServiceProvider::QueryService操作する必要はありません。
ただ、一般的な開発時の手っ取り早い確認のためには
TLBを用意するのも有効だとは思いますが。
Abyssさん
ご意見有難うございました。
また、お礼が大変遅くなり申し訳ありません。
「IUnknown_QueryService関数」について、関数そのものを
知らなかったため、関数自体どういうものなのか、
どのように使用するのかをいろいろ調べていましたが、
なかなか、探しきれていません。
他のサイト(VBA)で「IUnknown_QueryService関数」使用している例
(件名「64BitでのAccessibleObjectFromPoint」で、
回答は偶然ですが、Abyssさん)がありましたので、
どのように稼働するのか見てみようと思い、
Classモジュール部分を標準モジュールのVBA6.5の32Bit版にし、
自宅のPC(Windows XP Excel2003)で、実行してみました。
結果は、「Shiwapi.DLL」が壊れているのか、残念ながら、
「エントリIUnknown_QueryServiceがDLLファイルShiwapi内に
見つかりません」となり、稼働確認に至っていません。
DLLのバージョンも5.0以上の6.0.29005912のため、問題ない?
明日、引き続き会社で稼働確認および関数に関して調査したいと思います。
> 「エントリIUnknown_QueryServiceがDLLファイルShiwapi内に
> 見つかりません」となり、稼働確認に至っていません。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759858(v=vs.85).aspx
MSDNの最後の部分にも書いてありますが、
> .... this function must be called directly from Shlwapi.dll
> using ordinal 176.
Ordinal番号を付けて呼び出してください。OSのバージョンの問題ですので。
以下は、簡単な確認コードです。
# VB6の環境を取り出すのが面倒だったので、Office VBAで制作。
'(標準モジュール)
Declare Function GetClassNameW& Lib "User32" _
(ByVal hWnd&, _
lpClassName%, _
ByVal nMaxCount&)
Declare Function EnumWindows& Lib "User32" _
(ByVal lpEnumFunc&, _
ByVal lParam&)
Declare Function EnumChildWindows& Lib "User32" _
(ByVal hwndParent&, _
ByVal lpEnumFunc&, _
ByVal lParam&)
Declare Function RegisterWindowMessageW& Lib "User32" _
(ByVal lpString&)
Declare Function SendMessageW& Lib "User32" _
(ByVal hWnd&, _
ByVal uMsg&, _
ByVal wParam&, _
ByVal lParam&)
Declare Function ObjectFromLresult& Lib "Oleacc" _
(ByVal lResult&, _
ByVal riid&, _
ByVal wParam&, _
ppvObject As Any)
Declare Function IIDFromString& Lib "Ole32" _
(ByVal lpsz&, _
ByVal lpiid&)
Declare Function SysAllocString& Lib "Oleaut32" _
(ByRef psz%)
Declare Function IUnknown_QueryService& Lib "Shlwapi" Alias "#176" _
(ByVal pUnk As Any, _
ByVal guidService&, _
ByVal riid&, _
ppvOut As Any)
Declare Sub RtlMoveMemory Lib "Kernel32" _
(pDesc As Any, _
pSrc As Any, _
Optional ByVal cbLen& = 4)
Private pFn&
Public Sub Main()
pFn = VBA.CLng(AddressOf EnumProc)
EnumWindows pFn, 0
End Sub
Private Function EnumProc&(ByVal hWnd&, ByVal lParam&)
Dim ii%(50), sClass$
EnumProc = 1
GetClassNameW hWnd, ii(0), 50
RtlMoveMemory ByVal VarPtr(sClass), SysAllocString(ii(0))
If sClass = "IEFrame" Then
EnumChildWindows hWnd, pFn, hWnd
End If
If lParam = 0 Then Exit Function
If sClass = "Internet Explorer_Server" Then
TestProc hWnd
End If
End Function
Private Sub TestProc(ByVal hWnd As Long)
Dim hr&
Dim iid&(3), pp&, ll&
Dim pHtmlDoc As IUnknown ' IHTMLDocument2
Dim obj As Object ' IDispatch
Static WM_GetHTML&
pp = VarPtr(iid(0))
If WM_GetHTML = 0 Then
WM_GetHTML = RegisterWindowMessageW(StrPtr("WM_HTML_GETOBJECT"))
End If
ll = SendMessageW(hWnd, WM_GetHTML, 0, 0)
' IID_IHTMLDocument2
IIDFromString StrPtr("{332C4425-26CB-11D0-B483-00C04FD90119}"), pp
hr = ObjectFromLresult(ll, pp, 0, pHtmlDoc)
' IID_IWebBrowserApp
IIDFromString StrPtr("{0002DF05-0000-0000-C000-000000000046}"), pp
hr = IUnknown_QueryService(pHtmlDoc, pp, pp, obj)
Debug.Print Time, obj.LocationURL
End Sub
Abyssさん
早々のご回答有難うございました。
早速、サンプルコードをそのまま使用してVBAで行ってみました。
「Shell.Application」では取得できなかったオブジェクトも、
タイプライブラリを使用して取得したと同様に、
「IUnknown_QueryService関数」で取得できました。
これで、タイプライブラリの説明を行わなくても良くなりました。
本当に有難うございました。
また、「 〜 Lib "Shlwapi" Alias "#176"」の意味だったんですね。
翻訳機能の下記の部分をしっかり見ていませんでした。
正確には、なんのことなのか理解できていませんでした。
これからは、下記の意味が何を指しているのかがわかりましたので、
少しは進歩できそうです。
「IUnknown_QueryServiceをShlwapi.hに含まないWindowsのそれらのバージョンのために、
この機能は、序数176を用いたShlwapi.dllから、直接呼ばれなければなりません。」
For those versions of Windows that do not include IUnknown_QueryService in Shlwapi.h, this function must be called directly from Shlwapi.dll using ordinal 176.