2017-04-12 2 views
-1

Ich versuche, eine Win32-Desktop-Anwendung zu erstellen, die einfach den Hostnamen des Computers ausgibt, auf dem es ausgeführt wird. Ich habe es geschafft, eine solche C++ - Konsolenanwendung mit WSADATA-Struktur und gethostname() zu erstellen, die gut funktioniert. Wenn ich jedoch versuche, sie in meiner Win32-Desktop-Anwendung zu implementieren, funktioniert es überhaupt nicht.Wie kann ich gethostname Ergebnis in VS 2017 C++ Win32-Anwendung ausdrucken?

Mit Blick auf die Fehlermeldungen zeigen sie ein TCHAR - Char Inkompatibilität/Konvertierungsproblem ... Irgendwelche Vorschläge, wie diese Anwendung funktioniert?

win32project.cpp:

#include "stdafx.h" 

... 

case WM_PAINT: 
{ 
PAINTSTRUCT ps; 

TCHAR szPath[128] = _T(""); 
WSADATA wsaData; 
WSAStartup(MAKEWORD(2, 2), &wsaData); 
gethostname(szPath, sizeof(szPath)); 
WSACleanup(); 

HDC hdc = BeginPaint(hWnd, &ps); 

TextOut(hdc, 10, 10, szPath, _tcslen(szPath)); 

EndPaint(hWnd, &ps); 
} 
break; 

... 

Inhalt der stdafx.h in win32project.cpp oben enthalten:

#pragma once 

#include "targetver.h" 
#define WIN32_LEAN_AND_MEAN 
// Windows Header Files: 
#include <windows.h> 

// C RunTime Header Files 
#include <stdlib.h> 
#include <malloc.h> 
#include <memory.h> 
#include <tchar.h> 

// additional headers 
#include <iostream> 
#include <string> 
#include <Winsock2.h> 
#pragma comment(lib, "Ws2_32.lib") 
+1

* Blick auf die Fehlermeldungen * - Bitte posten Sie diese e Fehlermeldungen. Auch ein 'TCHAR' ist kein' char', wenn die App Unicode ist. – PaulMcKenzie

+1

Kaum zu wissen, was man davon halten soll. Der Code kompiliert nicht? Der Code wird kompiliert, verhält sich aber nicht wie beabsichtigt, wenn er ausgeführt wird? Für ersteres lesen Sie die Fehlermeldungen und denken Sie nach. Debuggen Sie Ihr Programm. –

+1

Ernsthaft, wir leben im 21. Jahrhundert. Lege den 'TCHAR' bereits ab. Das war ein Hilfsmakro für den Übergang von der Windows 95-Zeile zur Windows NT-Zeile. – MSalters

Antwort

0

Wenn Sie read the documentation (oder bei der Funktionsdeklaration anschauen), würden Sie siehe gethostname() akzeptiert keinen TCHAR Ausgabepuffer, nur einen char Puffer. Wenn Sie Ihr Projekt mit aktiviertem Unicode kompilieren, wird TCHAR zu wchar_t zugeordnet. Aus diesem Grund kann der Code nicht kompiliert werden. So TCHAR zu char ändern, und verwenden Sie TextOutA() direkt:

char szName[256] = ""; 
gethostname(szName, 256); 
TextOutA(hdc, 10, 10, szName, strlen(szName)); 

Ansonsten betrachten GetComputerName() anstelle:

TCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = TEXT(""); 
DWORD dwLen = sizeof(szName)/sizeof(TCHAR); 
if (!GetComputerName(szName, &dwLen)) dwLen = 0; 
TextOut(hdc, 10, 10, szName, dwLen); 

Oder besser, nur TCHAR fallen (? Tun Sie wirklich Win9x unterstützen müssen/ME) und verwenden Sie einfach wchar_t direkt:

WCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = L""; 
DWORD dwLen = sizeof(szName)/sizeof(WCHAR); 
if (!GetComputerNameW(szName, &dwLen)) dwLen = 0; 
TextOutW(hdc, 10, 10, szName, dwLen); 
+0

Mit nur dem Code in Ihrem dritten Vorschlag/Beispiel in der HDC-Malerei Abschnitt hat den Trick ... Danke! :) – hejo

+0

Bin ein wenig verwirrt von sizeof (WCHAR) obwohl ... Größe eines Datentyps? Ich habe viel zu lernen. & Finde darüber heraus ... – hejo

+0

'sizeof()' wird zur Kompilierzeit ausgewertet und meldet die Byte-Größe seines Operanden, der ein Typ, eine Variable oder ein Ausdruck sein kann. 'WCHAR' ist ein Alias ​​für' wchar_t', der unter Windows 2 Byte groß ist. 'MAX_COMPUTERNAME_LENGTH' ist 15. Also' sizeof (szName) 'ist' (15 + 1) * 2) = 32' Byte groß. Teilen Sie das mit 'sizeof (WCHAR) = 2' und Sie erhalten 16, was die maximale Anzahl von' WCHAR' Elementen ist, die 'szName' enthalten kann, nach der 'GetComputerName()' als Eingabe sucht. 'dwLen' könnte auch mit' DWORD dwLen = MAX_COMPUTERNAME_LENGTH + 1; 'initialisiert worden sein. –

Verwandte Themen