|
Wie können eine ActiveX-DLL oder ein ActiveX-Control den Inhalt
der Kommandozeile der Anwendung, von der sie geladen wurden, in
Erfahrung bringen? Es gibt zwar die Funktion Command$ - doch diese
liefert nur die Kommandozeile des jeweiligen Projekts. Bei einer
ActiveX-DLL und einem ActiveX-Control liefert Command$ jedoch
schlichtweg nichts. Weil aber eine ActiveX-DLL und ein
ActiveX-Control im gleichen Prozessraum laufen wie die Anwendung,
von der sie geladen wurden, können Sie den Inhalt der Kommandozeile
jener Anwendung über die API-Funktion GetCommandLine
erhalten.
Darüber hinaus gibt GetCommandLine sogar noch den Namen der
ausführbaren Datei der Anwendung zurück. Und wenn Sie Glück
haben, ist der Name der ausführbaren Datei sogar noch mit der
vollständigen Pfadangabe versehen. Ihr Glück hängt in dieser
Hinsicht von der konkreten Windows-Version ab - unter Windows
9x, Windows NT 4 ab Service Pack 4
und Windows 2000 scheint dies immer der Fall zu sein.
Doch da sich die MSDN-Dokumentation diesbezüglich recht vage
äußert, sollten Sie sich nicht darauf verlassen. Sicherer ist da
wohl der in "Vaterschaftsnachweis
I" gezeigte Weg.
Da GetCommandLine nur einen String zurück gibt, der beide Teile
enthält, müssen Sie diese voneinander trennen. Beginnt der String
mit einem Anführungszeichen, ist der Name bzw. komplette Pfadname
der ausführbaren Datei in Anführungszeichen eingeschlossen. Damit
haben Sie mit dem zweiten Anführungszeichen die richtige
Trennstelle. Fehlen die Anführungszeichen, können Sie sicher sein,
dass der Name bzw. der Pfadname der ausführbaren Datei selbst keine
Anführungszeichen enthält. Die Trennstelle ist somit das erste
Leerzeichen in dem gesamten String. Selbst über mehrfach
verschachtelt und indirekt geladene ActiveX-DLLs bzw. -Controls
hinweg funktioniert die Lieferung.
Die Prozedur ParentInfo füllt optional in den Parametern CmdLine
und AppPath übergeben, zuvor deklarierten Strings mit den beiden
Teilen des von GetCommandLine gelieferten Strings. Die beiden
weiteren Funktionen ParentCommand und ParentAppPath liefern die
beiden Teile der Einfachheit separat.
Private Declare Function GetCommandLine Lib "kernel32" _
Alias "GetCommandLineA" () As String
Private Const kQuote = """"
Public Sub ParentInfo(Optional CmdLine As String, _
Optional AppPath As String)
Dim nCmdLine As String
Dim nPos As Long
nCmdLine = GetCommandLine()
nCmdLine = Left$(nCmdLine, _
InStr(nCmdLine & vbNullChar, vbNullChar) - 1)
If Left$(nCmdLine, 1) = kQuote Then
nPos = InStr(2, nCmdLine, kQuote)
AppPath = Mid$(nCmdLine, 2, nPos - 2)
CmdLine = LTrim$(Mid$(nCmdLine, nPos + 1))
Else
nPos = InStr(nCmdLine, " ")
AppPath = Left$(nCmdLine, nPos - 1)
CmdLine = LTrim$(Mid$(nCmdLine, nPos))
End If
End Sub
Public Function ParentCommand() As String
Dim nParentCommand As String
ParentInfo nParentCommand
ParentCommand = nParentCommand
End Function
Public Function ParentAppPath() As String
Dim nParentAppPath As String
ParentInfo , nParentAppPath
ParentAppPath = nParentAppPath
End Function
Übrigens können Sie damit auch in einem als ActiveX-DLL
kompilierten Add-In zur VB-IDE feststellen, mit welchen
Kommandozeilen-Parametern die Entwicklungsumgebung aufgerufen worden
ist. Genau so klappt das auch bei COM-AddIns zu den Microsoft
Office-Anwendungen.
|