Frage

Ich brauche die Funktionalität einer Anwendung auf dem Namen der ausführbaren Datei basiert ändern. Nichts riesig, Wechsel nur Zeichenfolgen, die angezeigt werden und einige interne Bezeichner. Die Anwendung wird in einer Mischung aus nativer geschrieben und .Net C ++ - CLI-Code.

Zwei Wege, die ich ausgesehen habe an sind die GetCommandLine () Funktion in Win32 zu analysieren und zu stopfen, um mit dem AppDomain und anderen Dingen in .Net. Jedoch GetCommandLine verwendet, wird nicht immer so funktionieren, wenn der Debugger die Befehlszeile leer laufen soll. Und das .NET AppDomain Material um eine Menge Füllung zu erfordern scheint.

Was ist der schönste / einfachste / effizienteste Weg, um den Namen der ausführbaren Datei zu bestimmen, in C ++ / CLI? (Ich hoffe, Art, dass ich verpasst nur etwas Einfaches, das in .NET verfügbar ist.)

Edit:. Eine Sache, die ich erwähnen soll, ist, dass dies eine Windows-GUI-Anwendung ist mit C ++ / CLI, daher gibt es keinen Zugang zu der traditionellen C-Stil Hauptfunktion, es verwendet die Windows-WinMain () Funktion

War es hilfreich?

Lösung

Rufen Sie GetModuleFileName () mit 0 als ein Modulgriff.

Hinweis: Sie können auch die argv verwenden [0] Parameter zur Haupt oder rufen GetCommandLine (), wenn es keine Haupt ist. Beachten Sie jedoch, dass diese Methoden im Auge nicht unbedingt geben Sie den vollständigen Pfad zu der ausführbaren Datei. Sie werden die gleiche Zeichenfolge zurückgeben, die verwendet wurde, das Programm zu starten. Der Aufruf GetModuleFileName () gibt Ihnen immer einen vollständigen Pfad und Dateinamen an.

Andere Tipps

Ferruccio Antwort ist gut. Hier einige Beispiel-Code:

TCHAR exepath[MAX_PATH+1];

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
    MessageBox(_T("Error!"));

MessageBox(exepath, _T("My executable name"));

Mit dem argv Argumente main:

int main(int argc, char* argv[])
{
    printf("%s\n", argv[0]);  //argv[0] will contain the name of the app.
    return 0;
}

Sie müssen möglicherweise die Zeichenfolge scannen Verzeichnisinformationen und / oder Erweiterungen zu entfernen, aber der Name wird dort sein.

Mit __argv [0]

Es ist eine statische Methode auf Assembly, die es für Sie in .NET erhalten.

Assembly.GetEntryAssembly().FullName

Edit: Ich wusste nicht, dass Sie den Dateinamen wollte ... Sie können auch das bekommen durch den Aufruf:

Assembly.GetEntryAssembly().CodeBase

Das wird Sie den vollständigen Pfad zu der Versammlung (einschließlich des Dateinamens) erhalten.

Ich kann bestätigen, es funktioniert unter Win64 / Visual Studio 2017 / MFC

TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);

exe enthält vollständigen Pfad zur EXE-Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top