VSのmain関数の仕様について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jaljal

VSのmain関数の仕様について

#1

投稿記事 by jaljal » 11年前

windows.hをインクルードした場合、main関数はwinmainにしないとダメなのでしょうか?
テンプレートはwin32のコンソールアプリケーションです。
winmainじゃなくて、t_mainだったのですが、普通にmessageboxでhelloworldを出力する
プログラムは書けました。ただhwndでフレームを取得しようとしたら、hwndの宣言は出来た
のですが、読み取りができませんでした。どうすればいいでしょうか?

jaljal

Re: jaljal

#2

投稿記事 by jaljal » 11年前

ユーザー名と件名が逆になってしまいました。すいません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VSのmain関数の仕様について

#3

投稿記事 by softya(ソフト屋) » 11年前

WinMainはmainと初期化の仕方(crtやらウィンドウ関係の初期化)が違うだけですので、出来るか出来るかで言えば出来ます。
WinMainに飛び込んだ直後にブレークして呼び出し履歴からさかのぼってみてください。
※ 私もイメージとしては知っていてもやったことがないので、問題が有るかもしれません。

【補足】
タイトルと名前を入れ替えておきました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: VSのmain関数の仕様について

#4

投稿記事 by usao » 11年前

windows.hをインクルードしたかどうかではなくて,プロジェクトの種類で違います.

・Win32コンソールアプリケーション → main ( _tmain )
・Win32アプリケーション → WinMain
オフトピック
でもここらへんの話を実はよく知らないな…
>ただhwndでフレームを取得しようとしたら、hwndの宣言は出来た
>のですが、読み取りができませんでした。どうすればいいでしょうか?

こちらについては必要であればより具体的に質問されるとよいと思います.

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: VSのmain関数の仕様について

#5

投稿記事 by milfeulle » 11年前

コンソールアプリケーションでウィンドウハンドルを取得する方法が以下のように述べられています。

SDK32:コンソール ウィンドウのハンドル取得 - Microsoftサポート -

これによれば、

コード:

DWORD GetConsoleTitle(
  LPTSTR lpConsoleTitle,  // 文字列を受け取るバッファのアドレス
  DWORD nSize             // バッファのサイズ
);
でウィンドウのタイトルを取得し、

コード:

HWND FindWindow(
  LPCTSTR lpClassName,  // クラス名
  LPCTSTR lpWindowName  // ウィンドウ名
);
でHWNDを取得するようです。上記の資料では、ウィンドウ名を一端他のウィンドウをほぼ絶対に被ることのない名前にしてからその名前を使って取得しているようです。そのような処理を省いた簡単な取得例がのようになります。(256では足りない可能性もありますし、タイトルが被っている可能性もあるので実際には上記のような手順を踏んだ方がいいです。)

コード:

#include <windows.h>

int main() {
	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);

	return 0;
}
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VSのmain関数の仕様について

#6

投稿記事 by softya(ソフト屋) » 11年前

コンソールのウィンドウハンドルがほしいのか、新たなウィンドウのハンドルを生成したいのか明確な質問じゃないので2通りの答えが出てきます。
一番は、やりたいことの具体的な説明と失敗したソースコードを提示してもらうことの様です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jaljal

Re: VSのmain関数の仕様について

#7

投稿記事 by jaljal » 11年前

softyaさんタイトルとユーザー名交換ありがとうございました。

jaljal

Re: VSのmain関数の仕様について

#8

投稿記事 by jaljal » 11年前

コード:

#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 スキップ ==========



こういうエラーが出てコンパイルできません。

jaljal

Re: VSのmain関数の仕様について

#9

投稿記事 by jaljal » 11年前

DWORD GetConsoleTitle(
LPTSTR lpConsoleTitle, // 文字列を受け取るバッファのアドレス
DWORD nSize // バッファのサイズ
);


これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
リスト構造を思い出しました、C++は難解ですね、javaとは比べ物にならない…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VSのmain関数の仕様について

#10

投稿記事 by softya(ソフト屋) » 11年前

プロジェクトのプロパティでマルチバイト文字にすればコンパイルは通ると思います。

> これ凄い構成のクラスですね、引数もDWORDで、戻り値もDWORDなんですか?
C言語の関数です。

【補足】
Javaで言えばutilクラスに有るstaticメソッドの様なものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jaljal

Re: VSのmain関数の仕様について

#11

投稿記事 by jaljal » 11年前

ソフト屋さん、無事うまくいきました。
ユニコードの2倍の容量であるマルチコードにすればよかったんですね。
tchar=マルチコードということですもんね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VSのmain関数の仕様について

#12

投稿記事 by softya(ソフト屋) » 11年前

VisualC++の場合UNICODE文字(UTF-16)が2バイトです。マルチバイト文字(shift-jis)は1バイトか2バイトで混合です。
TCHARはchar(マルチバイト)かwchar_t(UNICODE)がプロジェクトのプロパティで切り替わる仕組みになっています。
それとcodeタグは[]で囲んでくださいね。投稿済みのは直しておきます。

【補足】
マルチバイト文字と言う分類で言うとuft-8もマルチバイト文字です。
vc++で扱うといろいろ問題がありますが、g++(gcc)なら扱うことが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jaljal

Re: VSのmain関数の仕様について

#13

投稿記事 by jaljal » 11年前

messageboxがユニコードに対応してないって事なんでしょうか?
とにかく、常に設定はマルチバイトにしておこうと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VSのmain関数の仕様について

#14

投稿記事 by softya(ソフト屋) » 11年前

少なくとも
MessageBox(h_wnd, "ok", "ok", MB_OK);
はUNICODEの書き方ではないです。
"ok"はマルチバイト文字で、L"ok"ならUNICODEであり_T("ok")ならコンパイルオプション切り替え対応です。
ちなみに_T("")はVC++独自規格です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jaljal

Re: VSのmain関数の仕様について

#15

投稿記事 by jaljal » 11年前

なるほど、引数を合せるって事ですね。"OK"はユニコードではないのですか。
いくらユニコードが2バイトだからといって、下位のマルチバイトも受け入れる事はできないんですね。
とても分かりやすい説明ありがとうございます、ソフト屋さん。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: VSのmain関数の仕様について

#16

投稿記事 by MoNoQLoREATOR » 11年前

ユニコードに対してマルチバイトは下位でも上位でもありません。
「ユニコード文字セット」と「マルチバイト文字セット」では文字列を並べる時の並べ方が違うのです。

対象が「ユニコード文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。
対象が「マルチバイト文字セット」というルールに従って並べられている場合はそのルールと照らし合わせて、その文字列がどのような文字列なのかを解釈します。

"文字" は「マルチバイト文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。
L"文字" は「ユニコード文字セット」というルールに従ってメモリに文字列情報を書き込んでくださいという意味です。

閉鎖

“C言語何でも質問掲示板” へ戻る