Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0347: Läuft ein Programm als Exe oder in der IDE?

 von 

Beschreibung 

Für z.B. ShareWare-Komponenten kann es interessant sein zwischen dem Laufen in der IDE oder als kompilierter Exe unterscheiden zu können. Hier werden zwei Methoden vorgestellt. Bei ersterer, ist durch die Übergabe des Fensterhandles des Träger-Formulars eine Unterscheidung gewährleistet. Die zweite Methode erfüllt ihren Zweck auch, wenn ein solches Handle nicht vorliegt, allerdings ist sie etwas unsauber, wenn jemand eine elegantere Lösung zur Verfügung stellen kann, so möge er das bitte unbedingt tuen.

Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetClassNameA (GetClassName), GetWindow

Download:

Download des Beispielprojektes [7,31 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Schaltfläche "Command2" auf Frame1
' Steuerelement: Schaltfläche "Command1" auf Frame1
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1

Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As _
        Long, ByVal wCmd 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

Const GW_OWNER = 4

Private Sub Form_Load()
  Call CheckGoodWay
End Sub

Private Sub Command2_Click()
  Call CheckBadWay
End Sub

Private Sub Command1_Click()
  Call CheckBadWay
End Sub

Private Sub CheckGoodWay()
  Dim aa$
  
    If IsRunningInIDE Then
      aa = "Dieses Programm läuft derzeit in der IDE!"
    Else
      aa = "Diese Programm läuft als komplierte Exe!"
    End If
    
    MsgBox (aa)
End Sub

Private Sub CheckBadWay()
  Dim aa$
  
    If IsRunningInIDE_DirtyTrick Then
      aa = "Dieses Programm läuft derzeit in der IDE!"
    Else
      aa = "Diese Programm läuft als komplierte Exe!"
    End If
    
    MsgBox (aa)
End Sub

'Die saubere Methode, Nachteil: Soll der ausführungszustand
'in einer fensterlosen Komponente getestet werden, wie z.B.
'DLLs oder OCXen, muß zwecks Prüfung das Fensterhandle des
'die Komponente aufrufenden Fensters mit an die Komponente
'übergeben werden.
Private Function IsRunningInIDE() As Boolean
  Dim Buffer$, ParenthWnd&
    
    Buffer = Space(128)
    ParenthWnd = GetWindow(Me.hwnd, GW_OWNER)
    Call GetClassName(ParenthWnd, Buffer, Len(Buffer))
    
    If Left(Buffer, 11) = "ThunderMain" Then
      IsRunningInIDE = True
    Else
      IsRunningInIDE = False
    End If
End Function

'Die zweite Methode: Funktioniert immer, auch in Komponenten
'Hier muß kein Handle an eine fensterlose Komponente überge-
'ben werden. Ein guter Stil ist das allerdings nicht.
Private Function IsRunningInIDE_DirtyTrick() As Boolean
  On Error Goto NotCompiled
  
    Debug.Print 1 / 0
    Exit Function
    
NotCompiled:
    IsRunningInIDE_DirtyTrick = True
    Exit Function
End Function

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 8 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Gregor am 23.09.2009 um 16:11

Das ist ein super tipp, und läuft auf Windows Vista 32bit

VB6 Version

Gruß Gregor

Kommentar von Carsten Schlegel am 20.11.2006 um 11:31

Hallo,

in der Regel funktioniert auch

App.LogMode

diese ist bei EXE 1 (VbLogOff) andernfalls 0 (vbLogAuto) oder 3 (VbLogToNT).

Diese Methode kann von Arbeitsplatz zu Arbeitsplatz anders sein, vorheriges testen ist angesagt aber diese Methode ist recht einfach.

Gruß,

C. Schlegel

Kommentar von JTK-One am 02.07.2004 um 16:25

Es gibt auch die Eigenschaft:
Ambient.UserMode
Damit kann man bei OCXen prima zwischen Design- und Runtime unterscheide.

Kommentar von Christian Bickel am 07.05.2004 um 11:18

Das geht auch einfacher:

Public Function isIDE () As Boolean 
Debug.Assert (isIDE=True)
'das wars ...da die Debug-Kommandos in der EXE nicht
'ausgeführt werden, liefert diese Funtion dann FALSE.
End Function

Kommentar von Daniel Pramel am 12.08.2003 um 10:32

Wenn man herausfinden möchte, ob die aufrufende Anwendung einee Shareware-ActiveX-Dll in der IDE läuft, bleibt nur die "saubere" Methode.

Die andere Nulldivisions-Methode funktioniert dann nicht.

Gruß,
Daniel

Kommentar von Darkforce am 26.08.2001 um 17:45

Welche Methode man anwendet hängt doch vom eigenen Programierstilk ab.

Kommentar von Simon Wawroschek am 18.05.2001 um 22:09

Also, ich find diese 'Bad'-Methode einen ganz guten Einfall. Ich wäre da niemals drauf gekommen. Auch wenn es 'dirty' ist, funktioniert es doch und das ist es doch, was man will...

Kommentar von Marius Hennecke am 09.05.2001 um 13:27

Mal zu dem Kommentar:"Ein guter Stil ist das zwar nicht" (DirtyTrick)
Es löst aber doch exakt das Problem. Außerdem hat es mich schmunzeln lassen als ich das gesehen habe. Mir gefällts so. *g*