|
|
|
When an interpreted client running in the IDE enters debug (break) mode, all the ActiveX DLL it's using continue to be in run mode as usual, even though you won't notice it because the DLL will be inactive until the program invokes one of its methods. There are times, however, when the DLL is able to execute independently of the client program, most notably when it contains a form with a Timer on it. Therefore in some cases you may want to stop any processing in the DLL, but unfortunately there is no simple way for a DLL to determine whether its client (interpreted) mode is in break mode or not.
The following code solves the problem. It retreives the handle of the main IDE window, and checks whether its caption contains the string "[break]". Note that when you press the F8 key to single-step on individual statements, the caption of the main IDE window temporarily switches to "[run]", therefore the ClientIsInBreakMode function below will always return False if called from a method exposed by the DLL, and can only return True if called from within a procedure that runs asynchronously with respect to the main program in the IDE. |
Click here to copy the following block | Private Declare Function EnumThreadWindows Lib "user32" (ByVal dwThreadId As _ Long, ByVal lpfn As Long, ByVal lParam As Long) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal _ hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Dim m_ClientIsInBreakMode As Boolean
Function ClientIsInBreakMode() As Boolean m_ClientIsInBreakMode = False EnumThreadWindows App.ThreadID, AddressOf EnumThreadWindows_CBK, 0 ClientIsInBreakMode = m_ClientIsInBreakMode End Function
Function EnumThreadWindows_CBK(ByVal hWnd As Long, ByVal lParam As Long) As _ Boolean Dim buffer As String * 512 Dim length As Long Dim windowClass As String Dim windowText As String length = GetClassName(hWnd, buffer, Len(buffer)) windowClass = Left$(buffer, length) If windowClass = "IDEOwner" Then length = GetWindowText(hWnd, buffer, Len(buffer)) windowText = Left$(buffer, length) If InStr(windowText, "[break]") Then m_ClientIsInBreakMode = True End If EnumThreadWindows_CBK = False Else EnumThreadWindows_CBK = True End If End Function |
|
|
|
Submitted By :
Nayan Patel
(Member Since : 5/26/2004 12:23:06 PM)
|
|
|
Job Description :
He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting. |
View all (893) submissions by this author
(Birth Date : 7/14/1981 ) |
|
|