■90533 |
Re[8]: AddHandler Eventの別スレッドについて |
□投稿者/ 魔界の仮面弁士 -(2019/03/18(Mon) 18:18:44)
| ■No90531 (TanuTanu さん) に返信 > しかし、VBAではInternet Explorer_Serverまで辿り付いたのですが > VB.NETで子ウィンドウを列挙することが出来ません。
VBA のコードを移植している、ということでしょうか。
それでは、VBA の API 宣言と VB2017 の API 宣言の 【両方】を見せてもらえますか?
提示をお願いする理由は、特に「ByVal」と「ByRef」の違いが重要だからです。
引数に ByVal も ByRef も書かなかった場合、 VBA では ByRef として解釈され、 .NET では ByVal として解釈される仕様であることにご注意ください。
> <DllImport("user32")> > Function EnumChildWindows( > <[In]()> ByVal hWndParent As IntPtr, > <[In]()> ByVal lpEnumFunc As EnumChildProc, > <[In]()> ByRef lParam As IntPtr > ) As Boolean > End Function
第4引数を ByRef IntPtr にしたのですね。 では、EnumChildProc の Delegate 宣言も見せてください。
AddressOf で指定した側が ByVal で、Delegate 定義が ByRef になっていて不整合を引き起こしていると思います。
' 参考資料1: https://dobon.net/vb/dotnet/process/enumwindows.html Public Delegate Function EnumWindowsDelegate(hWnd As IntPtr, lparam As IntPtr) As Boolean <DllImport("user32.dll")> _ Public Function EnumWindows(lpEnumFunc As EnumWindowsDelegate, lparam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function
' 参考資料2: https://smdn.jp/programming/tips/enumwindows/ Private Delegate Function WNDENUMPROC(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean <DllImport("user32")> _ Private Function EnumWindows(ByVal lpEnumFunc As WNDENUMPROC, ByVal lParam As IntPtr) As Boolean End Function
' 参考資料3: http://mt-soft.sakura.ne.jp/web_dl/vb-parts/enum_window/ Private Delegate Function EnumerateWindowsCallback(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer <DllImport("user32", EntryPoint:="EnumWindows")> _ Private Shared Function EnumWindows(ByVal lpEnumFunc As EnumerateWindowsCallback, ByVal lParam As Integer) As Integer End Function
' 参考資料4: http://nonsoft.la.coocan.jp/SoftSample/VB.NET/SampleEnumWindows.html Private Delegate Function D_EnumWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As D_EnumWindowsProc, ByVal lParam As Integer) As Integer |
|