relativer pfad zu einer datei im programmverzeichnis
-
Du schreibst kein C++ Programm. Das ist C++/CLI, eine andere Sprache.
-
Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo,
danke für eure Antworten.@C++-Entwickler
verwendest du irgendein Framework? TR_(), LaunchBrowser(), IDM_* sieht nicht nach Standard C++ aus.
ich weiss es nicht , ich verwende visual c++ 2010 und die Arbeitsmappe für meine Anwendung wurde mir von Freunden zur Verfügung gestellt.
Ich denke dein Bezug:
1. Bei Programmstart wechselst du das Arbeitsverzeichnis deiner Anwendung (CWD / current working directory) in das Verzeichnis deiner .exe
hat glaube ich nichts mit meinem Problem zu tun, aber vielleicht verstehe ich es auch falsch .... ?
Also das Programm das ich erstelle wird normal in den Ordner C:programme\meinprogramm installiert. Wird das Programm gestartet (man kann damit Formulare lesen) kann man über einen Meülink
case IDM_INSTRUKTION: LaunchBrowser(_TR("instruktion.exe")); break;
als Informationszusatz, die instruktion.exe auslösen. Das funktioniert immer.
Wird aber das Programm gestartet und ein Formular geöffnet, dann wird die instruktion.exe nicht mehr im Verzeichnis C:programme\meinprogramm gesucht, sondern im Verzeichnis indem das eingelesene Formular sich befindet. (kompliziert ?)@manni66
Du schreibst kein C++ Programm. Das ist C++/CLI, eine andere Sprache.
... dann bin ich wohl auch noch im falschen Forum?
-
Kommt drauf an, was deine Absicht ist. Willst du C++ oder C++/CLI programmieren?
-
Kommt drauf an, was deine Absicht ist. Willst du C++ oder C++/CLI programmieren?
Eigentlich würde ich gerne nur den verwendeten Code :
case IDM_INSTRUKTION: LaunchBrowser(_TR("instruktion.exe")); break;
soweit veränern, daß auf die einzulesende "instruktion.exe" die im Instalationsordner des MutterProgramms relativ zum Instalationsordner verwiesen wird.
Da ich den unterschied zwischen C++ und C++/CLI kann ich nicht sagen was ich programmieren muss.
-
Tja, die Zeilen könnten sogar C sein. Du musst wissen/entscheiden, in welcher Sprache du programmierst.
Wenn "System." im Programm vorkommt, ist es ein Hinweis auf CLI (es sei denn, System stammt von dir).
Zu LaunchBrowser finde ich spontan auch nur Hinweise auf .NET (spricht CLI), was aber nicht heißt, dass es nicht auch eine C++ Funktion mit diesem Namen geben könnte.
-
Ich gehe davon aus, dass deine Applikation *eigentlich* in C++ und zusammen mit irgendeinem Framework wie MFC o. ä. geschrieben ist.
System.Environment.CurrentDirectory
ist allerdings klar C# - dieser Code, da .NET, kann allerdings genau so gut in C++/CLI verwendet werden, weil dies auch eine .NET Sprache ist - natürlich mit entsprechender Syntax.ABER... ich empfehle dir bei C++ zu bleiben und die .NET Welt aussen vor zu lassen oder aber ganz auf .NET mit C# umzustellen. Von C++/CLI ist abzuraten - besonders in deinem Kontext, wo es nicht um Interoperabilität zwischen der nativen- und managed Welt geht.
Hier ein Code-Stück, mit dem du es versuchen könntest:
#include <Windows.h> #include <Shlwapi.h> #include <tchar.h> #include <system_error> #pragma comment (lib, "Shlwapi.lib") // ... case IDM_INSTRUKTION: { TCHAR path[MAX_PATH] = {}; DWORD result = GetModuleFileName(NULL, path, sizeof(path) / sizeof(path[0])); if (result == 0) { std::error_code ec(GetLastError(), std::system_category()); throw std::system_error(ec); } PathRemoveFileSpec(path); TCHAR newPath[MAX_PATH] = {}; PathCombine(newPath, path, _T("instruktion.exe")); LaunchBrowser(newPath); break; }
Kommentare:
* Ich vermute_TR(..)
ist ein Makro mit ähnlicher Funktion wie_T(..)
um Wide- und nicht Wide Literale zu unterstützen.
* Dieser Code setztstd::error_code
bzw.std::system_error
und damit C++11 voraus - falls das nicht vorhanden ist, einfach den Code entsprechend anpassen und z. B. eine eigene Exception werfen.pragma comment (lib...)
dient zum Linken der entsprechenden Library - selbstverständlich kann das auch über die Projekt-Einstellung erreicht werden.
* Falls es beim Bauen Probleme gibt, bitte die Fehlermeldungen mit dem entsprechenden Code-Ausschnitt 1:1 (=Copy/Paste!) hier zeigen.
-
@manni66
Wenn "System." im Programm vorkommt, ist es ein Hinweis auf CLI (es sei denn, System stammt von dir).
... ja "System" kommt vor ...
@theta, danke auch für deine Antwort...
Hier ein Code-Stück, mit dem du es versuchen könntest:
... hab ich versucht, kommen aber leider unzählige Fehlermeldungen, z.B. .:
1>C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\ws2def.h(91): error C2220: Warnung wird als Fehler interpretiert, es wurde keine object-Datei generiert.
C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\winsock.h(306): Siehe vorherige Definition von 'INADDR_BROADCAST'
1>src\Konvergent.cpp(475): error C2065: 'HTREEITEM': nichtdeklarierter Bezeichner
1>src\Konvergent.cpp(476): error C2065: 'hRoot': nichtdeklarierter Bezeichner
1>src\Konvergent.cpp(477): error C2065: 'hRoot': nichtdeklarierter Bezeichner
... und so weiter ...... bin ich bin damit überfordert ... (habe nicht geglaubt daß das so konpliziert ist .... )
-
Hast du die Probleme erst seit du den Code im
case IDM_INSTRUKTION:
und die Includes eingefügt hast?Es könnte ein Problem mit der Reihenfolge der Includes sein (
Winsock.h
/Winsock2.h
undWindows.h
vertragen sich nicht immer so gut). Versuche mal#define WIN32_LEAN_AND_MEAN
in der Zeile über#include <Windows.h>
einzufügen.Ansonsten zeige mal den Code von
Konvergent.cpp
...
-
... mit
Versuche mal [c]#define WIN32_LEAN_AND_MEAN
... genial, mit #define WIN32_LEAN_AND_MEAN läufts durch .... unglaublich ...
vielen herzlichen Dank, theta, viel Stress weniger, du hast mir sehr geheolfen,danke, Gruss Anna.