VSのmain関数の仕様について
VSのmain関数の仕様について
windows.hをインクルードした場合、main関数はwinmainにしないとダメなのでしょうか?
テンプレートはwin32のコンソールアプリケーションです。
winmainじゃなくて、t_mainだったのですが、普通にmessageboxでhelloworldを出力する
プログラムは書けました。ただhwndでフレームを取得しようとしたら、hwndの宣言は出来た
のですが、読み取りができませんでした。どうすればいいでしょうか?
テンプレートはwin32のコンソールアプリケーションです。
winmainじゃなくて、t_mainだったのですが、普通にmessageboxでhelloworldを出力する
プログラムは書けました。ただhwndでフレームを取得しようとしたら、hwndの宣言は出来た
のですが、読み取りができませんでした。どうすればいいでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VSのmain関数の仕様について
WinMainはmainと初期化の仕方(crtやらウィンドウ関係の初期化)が違うだけですので、出来るか出来るかで言えば出来ます。
WinMainに飛び込んだ直後にブレークして呼び出し履歴からさかのぼってみてください。
※ 私もイメージとしては知っていてもやったことがないので、問題が有るかもしれません。
【補足】
タイトルと名前を入れ替えておきました。
WinMainに飛び込んだ直後にブレークして呼び出し履歴からさかのぼってみてください。
※ 私もイメージとしては知っていてもやったことがないので、問題が有るかもしれません。
【補足】
タイトルと名前を入れ替えておきました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: VSのmain関数の仕様について
windows.hをインクルードしたかどうかではなくて,プロジェクトの種類で違います.
・Win32コンソールアプリケーション → main ( _tmain )
・Win32アプリケーション → WinMain
>ただhwndでフレームを取得しようとしたら、hwndの宣言は出来た
>のですが、読み取りができませんでした。どうすればいいでしょうか?
こちらについては必要であればより具体的に質問されるとよいと思います.
・Win32コンソールアプリケーション → main ( _tmain )
・Win32アプリケーション → WinMain
オフトピック
でもここらへんの話を実はよく知らないな…
>のですが、読み取りができませんでした。どうすればいいでしょうか?
こちらについては必要であればより具体的に質問されるとよいと思います.
Re: VSのmain関数の仕様について
コンソールアプリケーションでウィンドウハンドルを取得する方法が以下のように述べられています。
SDK32:コンソール ウィンドウのハンドル取得 - Microsoftサポート -
これによれば、 でウィンドウのタイトルを取得し、 でHWNDを取得するようです。上記の資料では、ウィンドウ名を一端他のウィンドウをほぼ絶対に被ることのない名前にしてからその名前を使って取得しているようです。そのような処理を省いた簡単な取得例がのようになります。(256では足りない可能性もありますし、タイトルが被っている可能性もあるので実際には上記のような手順を踏んだ方がいいです。)
SDK32:コンソール ウィンドウのハンドル取得 - Microsoftサポート -
これによれば、 でウィンドウのタイトルを取得し、 でHWNDを取得するようです。上記の資料では、ウィンドウ名を一端他のウィンドウをほぼ絶対に被ることのない名前にしてからその名前を使って取得しているようです。そのような処理を省いた簡単な取得例がのようになります。(256では足りない可能性もありますし、タイトルが被っている可能性もあるので実際には上記のような手順を踏んだ方がいいです。)
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VSのmain関数の仕様について
コンソールのウィンドウハンドルがほしいのか、新たなウィンドウのハンドルを生成したいのか明確な質問じゃないので2通りの答えが出てきます。
一番は、やりたいことの具体的な説明と失敗したソースコードを提示してもらうことの様です。
一番は、やりたいことの具体的な説明と失敗したソースコードを提示してもらうことの様です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: VSのmain関数の仕様について
#include "stdafx.h"
#include<windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HWND h_wnd;
{
TCHAR title[256];
GetConsoleTitle(title, 256);
h_wnd = FindWindow(NULL, title);
}
if(h_wnd == NULL) {
return -1;
}
MessageBox(h_wnd, "ok", "ok", MB_OK);
MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK );
return 0;
}
1>------ ビルド開始: プロジェクト: jaljal, 構成: Debug Win32 ------
1> jaljal.cpp
1>c:\users\jaljal\documents\visual studio 2010\projects\jaljal\jaljal\jaljal.cpp(22): error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [3]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>c:\users\jaljal\documents\visual studio 2010\projects\jaljal\jaljal\jaljal.cpp(38): warning C4305: '=' : 'double' から 'float' へ切り詰めます。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
こういうエラーが出てコンパイルできません。
Re: VSのmain関数の仕様について
DWORD GetConsoleTitle(
LPTSTR lpConsoleTitle, // 文字列を受け取るバッファのアドレス
DWORD nSize // バッファのサイズ
);
これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
リスト構造を思い出しました、C++は難解ですね、javaとは比べ物にならない…
LPTSTR lpConsoleTitle, // 文字列を受け取るバッファのアドレス
DWORD nSize // バッファのサイズ
);
これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
リスト構造を思い出しました、C++は難解ですね、javaとは比べ物にならない…
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VSのmain関数の仕様について
プロジェクトのプロパティでマルチバイト文字にすればコンパイルは通ると思います。
> これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
C言語の関数です。
【補足】
Javaで言えばutilクラスに有るstaticメソッドの様なものです。
> これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
C言語の関数です。
【補足】
Javaで言えばutilクラスに有るstaticメソッドの様なものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: VSのmain関数の仕様について
ソフト屋さん、無事うまくいきました。
ユニコードの2倍の容量であるマルチコードにすればよかったんですね。
tchar=マルチコードということですもんね。
ユニコードの2倍の容量であるマルチコードにすればよかったんですね。
tchar=マルチコードということですもんね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VSのmain関数の仕様について
VisualC++の場合UNICODE文字(UTF-16)が2バイトです。マルチバイト文字(shift-jis)は1バイトか2バイトで混合です。
TCHARはchar(マルチバイト)かwchar_t(UNICODE)がプロジェクトのプロパティで切り替わる仕組みになっています。
それとcodeタグは[]で囲んでくださいね。投稿済みのは直しておきます。
【補足】
マルチバイト文字と言う分類で言うとuft-8もマルチバイト文字です。
vc++で扱うといろいろ問題がありますが、g++(gcc)なら扱うことが出来ます。
TCHARはchar(マルチバイト)かwchar_t(UNICODE)がプロジェクトのプロパティで切り替わる仕組みになっています。
それとcodeタグは[]で囲んでくださいね。投稿済みのは直しておきます。
【補足】
マルチバイト文字と言う分類で言うとuft-8もマルチバイト文字です。
vc++で扱うといろいろ問題がありますが、g++(gcc)なら扱うことが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VSのmain関数の仕様について
少なくとも
MessageBox(h_wnd, "ok", "ok", MB_OK);
はUNICODEの書き方ではないです。
"ok"はマルチバイト文字で、L"ok"ならUNICODEであり_T("ok")ならコンパイルオプション切り替え対応です。
ちなみに_T("")はVC++独自規格です。
MessageBox(h_wnd, "ok", "ok", MB_OK);
はUNICODEの書き方ではないです。
"ok"はマルチバイト文字で、L"ok"ならUNICODEであり_T("ok")ならコンパイルオプション切り替え対応です。
ちなみに_T("")はVC++独自規格です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: VSのmain関数の仕様について
なるほど、引数を合せるって事ですね。"OK"はユニコードではないのですか。
いくらユニコードが2バイトだからといって、下位のマルチバイトも受け入れる事はできないんですね。
とても分かりやすい説明ありがとうございます、ソフト屋さん。
いくらユニコードが2バイトだからといって、下位のマルチバイトも受け入れる事はできないんですね。
とても分かりやすい説明ありがとうございます、ソフト屋さん。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: VSのmain関数の仕様について
ユニコードに対してマルチバイトは下位でも上位でもありません。
「ユニコード文字セット」と「マルチバイト文字セット」では文字列を並べる時の並べ方が違うのです。
対象が「ユニコード文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。
対象が「マルチバイト文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。
"文字" は「マルチバイト文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。
L"文字" は「ユニコード文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。
「ユニコード文字セット」と「マルチバイト文字セット」では文字列を並べる時の並べ方が違うのです。
対象が「ユニコード文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。
対象が「マルチバイト文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。
"文字" は「マルチバイト文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。
L"文字" は「ユニコード文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。