n00b @ ShellExecute
-
hi, bin ein absoluter n00b in c++...
versuche mit der funktion ShellExecute eine Anwendung zu starten, funzt aber nicht:
#include "shellapi.h" ShellExecute( NULL, LPCWSTR("open"), LPCWSTR("C:\\test2.txt"), NULL, NULL, SW_SHOWNORMAL );es öffnet sich einfach kein editor fenster, so wie ich das eigentlich will.
visual studio 2005
thx 4 help
mfg
imm0
-
#include <shellapi.h> ::ShellExecute(NULL, TEXT("open"), TEXT("C:\\test2.txt"), NULL, NULL, SW_SHOWNORMAL);so sollte das gehen

-
jo das funzt thx,
allerdings scheint das so jetzt nur mit textdokumenten zu gehen.
kannste du vllt auch noch kurz schreiben wie das geht, wenn man ein beliebiges dokument mit der standartanwendung öffnen will, so war das nämlich eigentlich gedacht.
-
hmm kommt drauf an ... muss halt für den Dateitypen schon ne Anwendung hinterlegt sein ... aber dann gehts mit ShellExecute und open ...
-
aber es ist doch jeder datei eine standartanwendung hinterlegt und es wird überall so beschrieben wie ich es ganz oben auch gemacht hab, dass halt automatisch erkannt wird, was die standartanwendung ist...
wie lautet denn die anweisung anstelle von "TEXT" für editor für den internet explorer und für excel ??
-
Arg jetzt weiß ich was du falsch verstanden hast ^^ Also ... du hattest in deinem Codeschnippsel einen Cast-Fehler drin. Du kannst nicht einen ANSI-String einfach in einen UNICODE-String casten.
Man verwendet, damit man die Anwendung sowohl UNICODE als auch ANSI Compilieren kann ein sogenanntes Makro, das nichts anderes macht als guckt ob UNICODE definiert ist ... wenn ja setzt es ein L davor und sonnst halt net...
#ifdef UNICODE #define TEXT(x) L##x #else #define TEXT(x) x #endifSo ist das in etwa definiert.
#include <shellapi.h> ShellExecute(NULL, TEXT("open"), TEXT("test1.bin"), NULL, NULL, SW_SHOWNORMAL);
-
jo ok, es funzt jetzt auch!!
endlich^^
also nochmal thx
-
Hallo auch,
hab da ein ähnliches Problem und leider viel zu wenig Ahnung.Solange ich den kompletten Pfad angebe, klappt es ja ohne Probleme.
Ich will aber eine Textdatei im Programmverzeichnis öffnen und kenne den Pfad vorher noch nicht.Wenn ich den Pfad einfach weglasse wird die Datei nicht gefunden und es passiert nichts.
ShellExecute(NULL, TEXT("open"), TEXT("log.txt"), NULL, NULL, SW_SHOWNORMAL);Und wenn ich den Pfad vorher als String definiere, hab ich den falschen Datentyp und bekomme nen Fehler.
String^ Logfile = String::Concat(Application::StartupPath, "\\log.txt"); ShellExecute(NULL, TEXT("open"), Logfile, NULL, NULL, SW_SHOWNORMAL);error C2664: 'ShellExecuteW': Konvertierung des Parameters 3 von 'System::String ^' in 'LPCWSTR' nicht möglich.

Kann mir vielleicht jemand sagen, wie ich davon nen LPCWSTR mache oder ob man das irgendwie anders lösen kann ?
Ist auch VS2005.Danke.
Gruß superfrog
-
Ich verwende für sowas immer GetModuleFileName, inetwa so:
TCHAR buffer[MAX_PATH+16]; ::GetModuleFileName(GetModuleHandle(), buffer, MAX_PATH); *_tcsrchr(buffer, '\\') = 0; _tcscat(buffer, TEXT("\\log.txt")); // in buffer steht jetzt der absolute Pfad zu "log.txt" im gleichen Verzeichnis wo die .exe liegt die gerade läuft. ::ShellExecute(0, TEXT("open"), buffer, 0, 0, SW_SHOWNORMAL);Mit C++/CLI kenn ich mich nicht aus, also kann ich dir auch nicht sagen wie man von einem "String^" nen char Pointer bekommt. Ich nehme aber mal an du wirst den String "pinnen" müssen oder sowas (kann aber leicht sein ich täusche mich da jetzt...).
-
hustbaer schrieb:
Ich verwende für sowas immer GetModuleFileName, inetwa so:
::GetModuleFileName(GetModuleHandle(), buffer, MAX_PATH);Dann tut es auch:
::GetModuleFileName(NULL, buffer, MAX_PATH);@superfrog:
Willst Du wirklich C++/CLI verwenden?
Wenn keine Not da ist solltest Du es vermeiden oder das ganze ganz in der Managed Welt mit C# schreiben, oder purem C++/CLI!Ansonsten zu String aus C++/CLI:
http://support.microsoft.com/kb/311259/en-usOhne
-
Martin Richter schrieb:
hustbaer schrieb:
Ich verwende für sowas immer GetModuleFileName, inetwa so:
::GetModuleFileName(GetModuleHandle(), buffer, MAX_PATH);Dann tut es auch:
::GetModuleFileName(NULL, buffer, MAX_PATH);Sicher? Bekomme ich da wenn der Code in einer DLL steht nicht den Pfad auf die DLL? Die Doku sagt "current module", das wäre für mich eben die DLL und nicht die EXE (und ich will in dem Fall ja den Pfad zur exe haben).
-
Solange Du bei GetModuleHandle keinen Namen angibst bekommst Du immer den der EXE und nie den der DLL!
Deshalb immer hInstance aus WinMain und DllMain speichern!
-
Danke allerseits, funktioniert jetzt.
Martin Richter schrieb:
Willst Du wirklich C++/CLI verwenden?
Wenn keine Not da ist solltest Du es vermeiden oder das ganze ganz in der Managed Welt mit C# schreiben, oder purem C++/CLI!Nein, wollte ich (wenn ich drüber nachdenke) eigentlich nicht und das scheint auch das eigentliche Problem zu sein.

War eigentlich pures Unwissen und zeigt nur wieder das ich noch echt viel lernen muß.Vielleicht auch ne Idee wie/wo man sich da als Anfänger diesbezüglich reinlesen kann, wenn man nicht dumm sterben will?
-
Martin Richter schrieb:
Solange Du bei GetModuleHandle keinen Namen angibst bekommst Du immer den der EXE und nie den der DLL!
Deshalb immer hInstance aus WinMain und DllMain speichern!
Ich meinte ja auch GetModuleFileName und nicht GetModuleHandle. Bei GetModuleHandle ist die Doku klar ("the file used to create the calling process"), bei GetModuleFileName aber eben nicht.
-
Martin Richter schrieb:
Solange Du bei GetModuleHandle keinen Namen angibst bekommst Du immer den der EXE und nie den der DLL!
Deshalb immer hInstance aus WinMain und DllMain speichern!