Funktion nimmt keine Zeichenketten als Parameter an.



  • bwbg schrieb:

    Ich habe zwar noch nie was mit der Windows-Programmierung am Hut gehabt, aber kann es sein, dass es sich beim

    'LPCWSTR'

    um ein long pointer (to) char wide string handelt und daher std::wstring erforderlich ist?

    Mutmaßungen über Mutmaßungen

    Grüße... Heiko

    Hallo Heiko,
    wie würde man das anwenden und was sollte das bewirken?

    Laut http://msdn.microsoft.com/en-us/library/aa364944(VS.85).aspx
    handelt es sich tatsächlich um einen LPCWSTR. Ich kenne diesen Datentyp nicht und weiss nicht wie ich damit umgehen soll.



  • drakon schrieb:

    bwbg schrieb:

    Ich habe zwar noch nie was mit der Windows-Programmierung am Hut gehabt, aber kann es sein, dass es sich beim

    'LPCWSTR'

    um ein long pointer (to) char wide string handelt und daher std::wstring erforderlich ist?

    Mutmaßungen über Mutmaßungen

    Grüße... Heiko

    Jo,darum benutzt er ja auch _T.

    Hast du denn tchar inkludet?

    EDIT:
    Zeig sonst ein wenig mehr Code her.

    Natürlich. Also das ist der ganze Code. Sind ein paar Experimente noch drin. Sinn des Ganzen ist es ein Windows auf 32 oder 64 bit zu überprüfen und ein Java Program zu starten.

    #include <stdafx.h>
    #include <windows.h>
    #include <shellapi.h>
    #include <iostream>
    #include <string>
    #include <Shlwapi.h>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char systemDir64[256];
    	char systemDir32[256];
    	strcpy(systemDir64,getenv("SystemRoot"));
    	strcpy(systemDir32,getenv("SystemRoot"));
    	strcat(systemDir64,"\\SysWOW64");
    	strcat(systemDir32,"\\System32");
    
    	string dir64 = "";
    	dir64 = dir64 + systemDir64;
    
    	string dir32 = "Windows";
    
    	cout << dir64 << endl;
    	cout << dir32 << endl;
    
    	// 64 bit windows
    	bool exist =(GetFileAttributes(_T(dir32.c_str()))==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    	if (exist){
    		strcat(systemDir64,"\\javaw.exe");
    		//ShellExecute(NULL, _T("open"), systemdir64, _T("-jar myswt.jar"), NULL, SW_SHOW);
    	}
    	else{
    		// 32 bit windows
    		bool exist =(GetFileAttributes(_T(systemDir32))==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    		if (exist){
    			strcat(systemDir32,"\\javaw.exe");
    			ShellExecute(NULL, _T("open"), _T(systemDir64), _T("-jar myswt.jar"), NULL, SW_SHOW);
    		}
    	}
    	system("PAUSE");
    	return 0;
    }
    


  • Also wenn du das ausschalten willst, musst du das in den Projekteinstellungen machen. Project->Project Propertys ->Configuration Properties->General und dann Character Set auf Multibyte stellen.
    Dann kannst du das Makro _T und somit L vor strings lassen.

    Allerdings hat Unicode Vorteile, man sollte daher diese auch lassen und lieber mit dem geringen Mehraufwand leben.

    EDIT:
    Ich bin von VC++ ausgegangen. Wies bei dir aussieht, weiss ich jetzt nicht, aber man mnüsste das irgendwo in den Einstellungen auch umstellen können.



  • SchtinkeSocke schrieb:

    drakon schrieb:

    bwbg schrieb:

    Ich habe zwar noch nie was mit der Windows-Programmierung am Hut gehabt, aber kann es sein, dass es sich beim

    'LPCWSTR'

    um ein long pointer (to) char wide string handelt und daher std::wstring erforderlich ist?

    Mutmaßungen über Mutmaßungen

    Grüße... Heiko

    Jo,darum benutzt er ja auch _T.

    Hast du denn tchar inkludet?

    EDIT:
    Zeig sonst ein wenig mehr Code her.

    Natürlich. Also das ist der ganze Code. Sind ein paar Experimente noch drin. Sinn des Ganzen ist es ein Windows auf 32 oder 64 bit zu überprüfen und ein Java Program zu starten.

    #include <stdafx.h>
    #include <windows.h>
    #include <shellapi.h>
    #include <iostream>
    #include <string>
    #include <Shlwapi.h>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char systemDir64[256];
    	char systemDir32[256];
    	strcpy(systemDir64,getenv("SystemRoot"));
    	strcpy(systemDir32,getenv("SystemRoot"));
    	strcat(systemDir64,"\\SysWOW64");
    	strcat(systemDir32,"\\System32");
    
    	string dir64 = "";
    	dir64 = dir64 + systemDir64;
    
    	string dir32 = "Windows";
    	
    	cout << dir64 << endl;
    	cout << dir32 << endl;
    
    	// 64 bit windows
    	bool exist =(GetFileAttributes(_T(dir32.c_str()))==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    	if (exist){
    		strcat(systemDir64,"\\javaw.exe");
    		//ShellExecute(NULL, _T("open"), systemdir64, _T("-jar myswt.jar"), NULL, SW_SHOW);
    	}
    	else{
    		// 32 bit windows
    		bool exist =(GetFileAttributes(_T(systemDir32))==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    		if (exist){
    			strcat(systemDir32,"\\javaw.exe");
    			ShellExecute(NULL, _T("open"), _T(systemDir64), _T("-jar myswt.jar"), NULL, SW_SHOW);
    		}
    	}
    	system("PAUSE");
    	return 0;
    }
    

    Ah sorry wegen Doppelpost. Wollte auf Editieren und bin wohl auf Zitieren gelandet.

    Ach noch sehr wichtig. Die ShellExecute geht natürlich auch nicht!!! Hier im Forum gibts für ShellExecute auch eine FAQ aber da wird ein AnsiString (man wieviele Variablentypen es bei c++ gibt 😡 ) benutzt. Ich nutzte aber Visual Studio 8 und da gibts wohl kein AnsiString oder? Das Problem ist genau das gleiche.

    Ich google mir schon seit Stunden einen ab.



  • SchtinkeSocke schrieb:

    Ach noch sehr wichtig. Die ShellExecute geht natürlich auch nicht!!! Hier im Forum gibts für ShellExecute auch eine FAQ aber da wird ein AnsiString (man wieviele Variablentypen es bei c++ gibt 😡 ) benutzt. Ich nutzte aber Visual Studio 8 und da gibts wohl kein AnsiString oder? Das Problem ist genau das gleiche.

    1. Wie wäre es mal mit F1 über den Befehl. Zumindestens sollte dann die Hilfe aufgehen (sofern du auch die MSDN installiert hast)...

    2. C++ hat recht wenige integrale Datentypen, nur wurde erst recht spät eine Klasse für Strings eingeführt (std::string, std::wstring) so das viele vorwiegend ältere Bibliotheken hier ihre eigenen Typen mitbringen (AnsiString hört sich nach Borland/Codegear C++ Builder an).

    Im Gegensatz zu Java musst du einfach wissen das es nicht eine Bibliothek gibt sondern sehr viele verschiedene.

    Und der Unterschied zwischen "Hallo" und einem std::string mit dem Inhalt "Hallo" ist der:

    "Hallo" ist ein Stringliteral des Typs char*.

    std::string ist ein eigener Typ der intern ein Stringliteral hält, aber viele Hilfsfunktionen anbietet. Unter anderem auch die Methode .c_str() um eine Umwandlung in den zugrundeliegenden Basistyp (Bei std::string ist das char*, bei std::wstring ist es t_char*) vorzunehmen... Ein std::string sollte weitgehend wie ein Javastring verwendbar sein.

    cu André



  • 1. Findet nie was. Ist wohl bei der Installation was falsch gleaufen. Auserdem bringt mir das nichts. Da wird nur das stehen was ich schon weiß.

    Was bleibt ist mein Problem. GetFileAttributes wie auch ShellExecute brauchen einen
    LPCWSTR als Parameter. Egal wie lange ich nach einer Lösung suche, ich finde keine die bei mir funktioniert.

    Hilfreich wäre ein unter Visual Studio 8 funktionierend geschriebener Quellcode der einfach nur zb. ShellExecute aufruft ohne dabei "notepad.exe" als Paramater zu bekommen sondern das Ganze über eine Variable macht.

    Ansonsten muss ich das wohl als nicht möglich abstempelln und mir dieses Borland angucken. Vieleicht gehts ja damit.



  • WinAPI-Funktionsnamen expandieren - je nach Compilereinstellung - zu FunktionW oder FunktionA (Wide-String/Unicode oder ANSI). Du benutzt anscheinend den Unicode-Modus, weshalb die WinAPI gerne Widestrings hätte, benutzt aber selbst normale "schmale" Std-Strings. Da kann aber C++ nichts für 🙂

    Du hast also mehrere Möglichkeiten:
    1. Stell das Programm konsequent auf ANSI um
    2. Stell das Programm konsequent auf UNICODE um
    3. Sprich direkt ShellExecuteA, GetFileAttributesA usw. an.

    Von einem std:: (w)string zu einem LPC(T/W)STR kommst Du übrigens mit der Methode c_str().



  • EDIT

    Ok ich denke ich habe es.

    Danke für euere Erklärungen. Jetzt habe ich auch den Sinn verstanden.

    Mit dem A am Ende gehts.

    string dir32 = "C:\\Windows\\System32\\javaw.exe";
    	ShellExecuteA(NULL, "open", dir32.c_str(), "-jar myswt.jar", NULL, SW_SHOW);
    

    Und

    bool exist =(GetFileAttributesA(dir32.c_str())==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    


  • SchtinkeSocke schrieb:

    bool exist =(GetFileAttributesA(dir32.c_str())==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    

    Der Code ist trotzdem Quatsch. Zuerst einmal ist die Verwendung des konditionalen Operators hier Quatsch, und außerdem gilt 'bool' != 'BOOL'! (Das wird gleich zweimal im obigen Code missachtet.)

    Der Code ist demnach falsch und liefert undefiniertes Verhalten. Korrekt wäre folgendes:

    bool exists = (GetFileAttributesA(dir32.c_str()) == INVALID_FILE_ATTRIBUTES) == FALSE;
    


  • Konrad Rudolph schrieb:

    SchtinkeSocke schrieb:

    bool exist =(GetFileAttributesA(dir32.c_str())==INVALID_FILE_ATTRIBUTES) ? FALSE : TRUE;
    

    Der Code ist trotzdem Quatsch. Zuerst einmal ist die Verwendung des konditionalen Operators hier Quatsch, und außerdem gilt 'bool' != 'BOOL'! (Das wird gleich zweimal im obigen Code missachtet.)

    Der Code ist demnach falsch und liefert undefiniertes Verhalten. Korrekt wäre folgendes:

    bool exists = (GetFileAttributesA(dir32.c_str()) == INVALID_FILE_ATTRIBUTES) == FALSE;
    

    Hm ok. Da es wohl zich verschiedene string Typen gibt, gibts wohl auch ein paar bool(s).

    Von dem konditionalen Operator halte ich sowieso nicht viel. Die Zeile habe ich irgendwo geklaut ;).



  • Konrad Rudolph schrieb:

    Der Code ist demnach falsch und liefert undefiniertes Verhalten. Korrekt wäre folgendes:

    bool exists = (GetFileAttributesA(dir32.c_str()) == INVALID_FILE_ATTRIBUTES) == FALSE;
    

    aber auch nicht wirklich sinnvoll 🙂

    du missachtest grad deine eigene aussage:

    und außerdem gilt 'bool' != 'BOOL'!

    und der operator== liefert einen bool den du dann mit nem BOOL(FALSE) vergleichst.

    bool exists = GetFileAttributesA(dir32.c_str()) != INVALID_FILE_ATTRIBUTES;
    


  • otze schrieb:

    Konrad Rudolph schrieb:

    Der Code ist demnach falsch und liefert undefiniertes Verhalten. Korrekt wäre folgendes:

    bool exists = (GetFileAttributesA(dir32.c_str()) == INVALID_FILE_ATTRIBUTES) == FALSE;
    

    aber auch nicht wirklich sinnvoll 🙂

    bool exists = GetFileAttributesA(dir32.c_str()) != INVALID_FILE_ATTRIBUTES;
    

    LOL.


Anmelden zum Antworten