Computernamen ermitteln



  • Hi,

    ich habe ein prob mit dem Code hier:

    LPWCH GetDestination()
    {
    	DWORD dwSize = 255;
    	WCHAR compName;
    
    	GetComputerName(&compName, &dwSize);
    
    	return &compName;
    }
    

    was ist daran falsch? eigentlich sollte das doch funzen...

    Danke.



  • Die Variable "compName" bietet Platz für genau ein Zeichen - ein wenig eng, um dort einen Rechner-Namen unterbringen zu wollen.

    (außerdem solltest du dich mal damit beschäftigen, wie lange eine lokale Variable gültig ist - auf jeden Fall nicht lange genug, um mit der zurückgegebenen Adresse irgendwas sinnvolles machen zu können)



  • na gut...

    LPWCH GetDestination()
    {
        WCHAR compName[MAX_COMPUTERNAME_LENGTH + 1];
        DWORD dwSize = sizeof(compName);
    
        GetComputerName(&compName, &dwSize);
    
        return &compName;
    }
    

    aber das funzt immer noch nicht.



  • Erstens wird ein Array implizit in einen Zeiger umgewandelt, wenn du es an eine Funktion übergibst (d.h. du brauchst das & vor 'compName' nicht).

    Zweitens reicht der Gültigkeitsbereich des Arrays weiterhin nicht aus, um es außerhalb der Funktion sinnvoll nutzen zu können (entweder du holtst dir deinen Speicher dynamisch vom Heap oder du verwendest ein statisches Array - die dritte Möglichkeit wäre es noch, sich das Ziel-Array von der aufrufenden Funktion geben zu lassen).

    Und drittens ist "funktioniert nicht" eine miserable und nichtssagende Fehlerbeschreibung 😉



  • #include <windows.h>
    
    void GetDestination(LPWSTR lpDestination);
    
    int __stdcall WinMain(HINSTANCE hInstance,
    			HINSTANCE hPrevInstance,
    			LPSTR     lpCmdLine,
    			int       nShowCmd)
    {
    	// makes low priority on success
    	SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
    
    	WCHAR destination[MAX_PATH+1];
    	GetDestination(destination);
    
    	MessageBox(NULL, destination, L"Caption", MB_OK);
    
    	return 0;
    }
    
    void GetDestination(LPWSTR lpDestination)
    {
    	WCHAR compName[MAX_COMPUTERNAME_LENGTH + 1];
    	DWORD dwCompNameSize = sizeof(compName);
    	GetComputerName(compName, &dwCompNameSize);
    
    	lpDestination = compName;
    }
    

    naja, ich bin auch neu bei c++.
    aber ich habe jetzt etwas anderes versucht, leider gibt die MessageBox nur hyroglyphen aus.
    Was ist denn nun wieder falsch?

    Danke.



  • Vermutlich weil du nicht ganz begriffen hast, was "call-by-reference" eigentlich bedeutet - und daß das dort oben kein cbr ist. Ersetz mal die letzte Zuweisung durch "wcscpy(lpDestination,compName);".

    Noch einige Bemerkungen:

    • Ich bin mir nicht sicher, wie groß MAX_PATH und MAX_COMPUTERNAME_LENGTH sind, aber wenn du Pech hast, zerlegst du mit der Aktion den Speicher des Hauptprogramms
    • Eine Mischung von generischen Funktionen (GetComputerName() und MessageBox() arbeiten mit TCHAR, was je nach Projekteinstellungen etwas anderes darstellen kann) mit festverdrahteten Datentypen (WCHAR ist immer wchar_t, unabhängig von den Projekteinstellungen) ist zumindest riskant. Entweder du arbeitest konsequent mit TCHAR und Co, oder du verwendest direkt die WCHAR-Funktionen GetComputerNameW() und MessageBoxW().
    • Wenn du schon mit C++ arbeitest, solltest du dir auch eine vernünftige String-Klasse suchen - egal was du verwendest, es ist (fast) immer günstiger als nackte char-Arrays.

Log in to reply