2017-04-12 13 views
-1

私は実行されているコンピュータのホスト名を単に出力するWin32デスクトップアプリケーションを作成しようとしています。私はWSADATA構造体とうまく動作するgethostname()を使ってそのようなC++コンソールアプリケーションを作成することができました。しかし、私がWin32デスクトップアプリケーションでそれらを実装しようとすると、まったく動作しません。VS 2017 C++ Win32アプリケーションでgethostnameの結果をどのように出力するのですか?

エラーメッセージを見ると、TCHAR - char互換性/変換の問題を示しています...このアプリケーションを動作させる方法に関する提案はありますか?

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; 

... 

stdafx.hをの含有量が上記win32project.cppに含ま:あなたread the documentation(または単に関数の宣言を見て)場合

#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

*エラーメッセージを見てください* - それらを投稿してくださいエラーメッセージ。また、アプリケーションがUnicodeの場合、 'TCHAR'は' char'ではありません。 – PaulMcKenzie

+1

これをどうしたらいいか分かりません。コードはコンパイルされませんか?コードはコンパイルされますが、実行時に意図したとおりに動作しませんか?前者については、エラーメッセージを読んで考えてください。後者については、プログラムをデバッグしてください。 –

+1

真剣にも、私たちは21世紀に住んでいます。既に 'TCHAR'を削除してください。これは、Windows 95ラインからWindows NTラインに移行するヘルパーマクロでした。 – MSalters

答えて

0

、あなたはでしょうgethostname()TCHAR出力バッファを受け入れないことを確認してください。charバッファのみです。 Unicodeを有効にしてプロジェクトをコンパイルすると、TCHARwchar_tにマップされます。それがあなたのコードがコンパイルに失敗する理由です。だから、charTCHARを変更し、直接TextOutA()を使用します。

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

そうでない場合は、代わりにGetComputerName()の使用を検討:

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); 

以上、ちょうど(あなたが本当にWin9xの/ MEをサポートする必要があるのですか?)TCHARをドロップwchar_tを直接使用してください:

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

hdcペインティングセクション内の3番目の提案/例のコードのみを使用してトリックを行いました...ありがとう! :) – hejo

+0

sizeof(WCHAR)でも少し困惑しています...データ型のサイズ? – hejo

+0

'sizeof()'はコンパイル時に評価され、そのオペランドのバイトサイズを報告します。これは型、変数、または式になります。 'WCHAR'は' wchar_t'のエイリアスです。これはWindowsでは2バイトです。 'MAX_COMPUTERNAME_LENGTH'は15です。したがって' sizeof(szName) 'は'(15 + 1)* 2)= 32'バイトです。これを 'sizeof(WCHAR)= 2'で割ると' szName'が保持できる 'WCHAR'要素の最大数である16が得られます。これは' GetComputerName() 'が入力として探しているものです。 'dwLen'も' DWORD dwLen = MAX_COMPUTERNAME_LENGTH + 1; 'を使って初期化されている可能性があります。 –

関連する問題