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