RSS
StartseiteKnowledge LibraryTop 10Impressum

Wo bin ich, EXE oder IDE?

Feststellen, ob eine Anwendung im Rahmen der IDE oder eigenständig ausgeführt wird

VB bietet keine direkte Möglichkeit zur Beantwortung der Frage, ob Programmcode innerhalb der VB IDE ausgeführt wird oder als eigenständige Anwendung. Es gibt dennoch mehrere indirekte Wege, diese Information zu ermitteln.

Auch wenn VB keine direkte Möglichkeit zur Beantwortung der Frage bietet, ob Programmcode innerhalb der VB IDE ausgeführt wird oder als eigenständige Anwendung, gibt es doch mehrere indirekte Wege, diese Information zu ermitteln.

Der Klassiker dürfte wohl die Debug.Print Anweisung und eine Fehlerprovokation mit einer Division durch Null sein. In der IDE verursacht diese Anweisung einen auffangbaren Fehler, in der kompilierten Anwendung jedoch nicht:

Public Function IsInIDE() As Boolean
  On Error Resume Next
  
  Debug.Print 1 / 0
  
  IsInIDE = Err.Number <> 0
End Function

Doch Vorsicht, es wäre ein Trugschluss, aus diesem Ergebnis das Resümee zu ziehen, dass Debug.Print Anweisungen beim Kompilieren entfernt oder einfach übergangen würden, denn eine über Debug.Print aufgerufene Funktion, wird auch im Kompilat ausgeführt:

Public Function IDEOnlyCode() As Boolean
  MsgBox "Ich sollte nur in der IDE erscheinen.", vbInformation
End Function

Debug.Print IDEOnlyCode

Die durch die Funktion IDEOnlyCode erzeugte Meldung erscheint sowohl in der IDE, als auch in der kompilierten Anwendung.

Anders verhält sich dagegen die Debug.Assert Anweisung. Funktionsaufrufe über diese Anweisung, werden wirklich nur in der IDE ausgeführt und nicht auch noch im Kompilat. Codeteile, die nur in der IDE ausgeführt werden sollen, ließen sich also problemlos in eine separate Funktion auslagern:

Public Function IDEOnlyCode() As Boolean
  ' Code, der nur in der IDE benötigt wird oder 
  ' eine globale Variable setzt, die den Status
  ' IDE oder EXE angibt.
  IDEOnlyCode = True
End Function

Debug.Assert IDEOnlyCode

Die dritte Möglichkeit greift auf das API zurück und ermittelt über die API Funktion GetModuleFileName den Modulnamen der Anwendung, denn in der IDE läuft diese im Modulkontext der VBx.EXE:

Private Declare Function GetModuleFileName Lib "kernel32" Alias _
        "GetModuleFileNameA" (ByVal hModule As Long, _
        ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Const MAX_PATH = 260

Public Function IsInIDE() As Boolean
  Dim strPath As String
  Dim lRet    As Long
  
  strPath = Space$(MAX_PATH)
  
  lRet = GetModuleFileName(App.hInstance, strPath, Len(strPath))
  
  If lRet <> 0 Then
    IsInIDE = LCase$(Mid$(strPath, lRet - 6, 7)) Like "vb?.exe"
  End If
End Function