VB 5/6-Tipp 0347: Läuft ein Programm als Exe oder in der IDE?
von ActiveVB
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: | Verwendete API-Aufrufe: | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
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*