2016-03-20 9 views
0

私はWin32アプリケーションを作成していますが、私はlogInフォームを持っていますが、編集ウィンドウの値を取得することはできません。私はこれを好きでしたが、何も得ません。私のミスはどこですか?OutputDebugStringが空の理由

#define passwordWindowId 2 

HWND passwordWindowHandle = CreateWindow(TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD, 10, 80, 150, 20, hWnd, (HMENU)passwordWindowId, NULL, NULL); 
int len = GetWindowTextLength(GetDlgItem(passwordWindowHandle, passwordEditId)); 
LPWSTR passwordWindowValue; 

GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1); 
OutputDebugString(passwordWindowValue); 

しかし、私はOutputDebugString(L"test");を行う場合、私は、出力タブでtestを参照してください。

+1

'passwordWindowValue'は初期化されていないポインタです。何も受信できません。また、編集ボックスは空白です(CreateWindowの2番目のパラメータはテキストです)。したがって、GetWindowTextは空の文字列を取得します。それはすべて働く。 –

+0

あなたはエラーをチェックすることを学ばなければならないでしょう。呼び出す関数のドキュメントを読んでください。あなたはエラーを全くチェックしません。 –

答えて

4

あなたのコードではエラーが多く、微妙で致命的なものもあります。

#define passwordWindowId 2 

低管理IDのいくつかはダイアログマネージャによって使用されており、ユーザー定義コントロールで過負荷にしないでください。一般的な規則は、100から始まる番号の割り当てを開始することです(Why do dialog editors start assigning control IDs with 100?参照)。

もう1つの一般的な規則は、プリプロセッサシンボルにすべての大文字の名前を使用することです。

HWND passwordWindowHandle = CreateWindow(TEXT("EDIT"), TEXT(""), ... 

これは(CreateWindowの2番目のパラメータを参照)エディットコントロールを作成しています。これ自体はバグではありませんが、コントロールにテキストが含まれていると想定することはできません。

また、バグではなく、一般的なテキストマッピングを使用することは一般的には役に立ちません。 APIのUnicodeバージョンは、ワイド文字列と文字列リテラル(HWND passwordWindowHandle = CreateWindowW(L"EDIT", L"", ...)とともに使用してください。

LPWSTR passwordWindowValue; 
LPWSTR

wchar_t*のtypedefであるので、上記のことを初期化せずにポインタを定義します。バグではありませんが、そのポインタを使用し始めると、未定義の動作になります。事前に最大サイズがわかっている場合は、固定サイズのローカル配列を作成するか、動的にサイズの変更されたコンテナ(たとえばstd::vector<wchar_t> buffer(len + 1);)を使用して、GetWindowTextへの次の呼び出しのためにストレージを割り当てる必要があります。物事が壊れ

GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1); 

これは、次のとおりです。あなたが割り当てられていないメモリに書き込むためにAPIコールを要求しているが、初期化されていないポインタで指されます。上で指摘したように、GetWindowTextを呼び出す前にメモリを割り当てる必要があります。また、汎用テキストマッピングを呼び出していますが、明示的なワイド文字列型を渡しています。代わりにGetWindowTextWを使用してください。

OutputDebugString(passwordWindowValue); 

引数はまだ初期化されていないポインタです。そうでない場合でも、コントロールテキストは空であるため、指し示すメモリは空の文字列になります。繰り返しますが、明示的なワイド文字列を渡しながら、汎用テキストマッピングを呼び出しています。代わりにOutputDebugStringWを使用してください。

さらに、エラーを一切チェックしていません。使用しているすべてのWindows API呼び出しが失敗する可能性があり、失敗がないかどうかを確認する必要があります。各API呼び出しのエラーをチェックする方法については、ドキュメントを参照してください。

+0

ありがとう! – rel1x

3

LPWSTR passwordWindowValue; 
GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1); 

これは、あなたがGetWindowText

にuninitalisedポインタを渡すそして、あなたが行われた後、[] passwordWindowValueを削除している

LPWSTR passwordWindowValue = new wchar_t[len + 1]; 
GetWindowText(passwordWindowHandle, passwordWindowValue, len + 1); 

でなければなりません。

+0

私は今、2つのエラーがあります: 'int len - 式は定数値を持つ必要があります'と 'WSTR is undefined'です。あなたは 'wstring'を意味しますか?私はヘッダで見つけられません – rel1x

+0

WSTRの代わりにwchar_tを使用してください(@ user93353が作成したと思います:) –

+0

また、C++は動的長さの配列をサポートしていません。 –

関連する問題