リンクフリーを近日中にとりやめる予定です

すでにリンクを貼っていただいている方、ご一報頂きたくお願い申し上げます。


ごく少数ですが、リンクをお断りする場合があります



ブログ内 風景光景カテゴリー

続編記事などをご希望の方は こちらへどうぞ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[未掲載分] 車輪の再発明 (3)

元来、好ましい意味で用いられない「車輪の再発明」。



筆者は、そのような行為を肯定的に捉えている。
なぜならば、新しい技術や文化が芽生えるきっかけは、一見無駄と思われることへの挑戦である・・・


お知らせ
活動休止にともない、この記事を事前に予約投稿してあります。
トップ記事の固定を目的としています


この題目は2012年暮れ頃に掲載しようと下書きし、諸事情により掲載却下とした分です。
前話、車輪の再発明 (2)にひきつづき、利用環境を OS はWindows , CPU は Intel 製、いわゆるウィンテル機を前提に綴ります。

何らかの改善を加えることにより、どの程度速くなるのかを確認したい。となると、
「Windows 上 で動くアプリ(ソフトウェア)を作成する」ことになる。
ダイアログ上に測定結果を表示することで、違いを把握し易くなる。



今回は「速い・遅い」の話から逸れます。
この題目のきっかけとなったブロガーさんを見るかぎり、「まだ実戦ではなく、C/C++ 言語の習得に奮闘している段階」とのことでした。その際、いわゆる Hello World! 、「文字を表示するだけの単純なアプリ」を組むのにも、時間を費やしていたように感じました。
それ故、開発環境について綴ります。

今までにひきつづき、話の前提としては
・OS ---> Windows 7
・PC ---> Intel 製 CPU を搭載、ただし Itanium を除く
・開発言語 ---> C/C++

アプリ(ソフトウェア)を作るアプリ
つまり統合開発環境の中で使い勝手の良いものを入手するのが先決。
開発環境は多々ある。その中でも使い勝手が良い、「アプリを作るためのアプリ」として挙げられるのは、「Visual Studio」だろう・・・


※ これは2012年6月15日に掲載した記事の画像です

2012年6月15日分の過去記事でも載せたとおり、筆者も永年愛用している。
該当記事に写っているのは Visual Studio 6.0。Windows 98 や Windows NT 4.0 が全盛の頃のモノ。

筆者は C/C++ 言語用には Visual C++ 4.0 あたりから利用している。(それまでは別のモノを利用していた。) 時期としてはWindows 95 が登場した頃であろうか。
その頃は、Visual Basic 4.0 などは別売りされていた。やがて、C/C++ , Basic , Java などの開発が全てがひとつのパッケージにまとまり、Visual Studio シリーズとしてリリースされるようになった。

「アプリを作るためのアプリ」として「Visual Studio」を推すにはそれなりの理由がある。
かつては、統合開発環境においても対抗製品が複数介在した。利用する側としては選択に迷う。
やがて、ワープロや表計算の分野でも同様であったように、時間を経て淘汰された結果、OS ( Windows ) を製造、販売している Microsoft の製品が生き残る結果となった。
敗者からは、「OSとアプリは接に関わっているので ~~」などの弁が聞こえてきそうだ。
しかし、筆者が想うに「利用者からみた使い勝手」が断然違った。
「乗り心地の悪い自動車を買ってしまった」と後悔すれば、次の買い替え時には別のメーカーの自動車を選択することだろう・・・

名称からも判るように、Visual Studio 2005 や 2008 のようにリリースされた年号が付いている。
大まかに言えば、新しいバージョンのOS ( Windows ) が登場とリンクするように Visual Studioも新版がリリースされてきた。

Windows に Home 版や Pro 版 といったエディションの違いがあるのと同様、Visual Studio にもいつくかのエディションが存在する。各エディションごとに、細かい違いはある。

Visual Studio の中でも 無償で提供されているエディションがある。Express Edition と呼ばれ、学生さんやプログラミングを学習している方々を対象としている。
Express Edition は無償で提供されるのとひきかえに、いくらかの機能が削減されている。
本格的にプログラミングしたいときに何かが足りない感じは否めない。
例を挙げれば、MFC ( Microsoft Foundation Class の略 ) と呼ばれるクラスライブラリ集が付属していない。「車輪の再発明」を避けるためには、既存のライブラリを使うのが望ましい・・・

※ 学生さんの中で本格的にプログラミングしたいヒトは何らかの優待制度があるので各自調べてみるとよいでしょう。

※ Express エディションがあるのは Visual Studio 2005 以降です。それより古いバージョンに無償のエディションはありません。

昨今、64ビット版の OS が搭載された PC が増えている。Express エディションで64ビット向けのアプリを作成するのも可能。その場合は Windows SDK のインストールが必要。32ビット/64ビットを問わず、Windows 上で動作するアプリを作成したいならばインストールすべきである。
Windows SDK は無償で配布されている。
Windows SDK とは、かつて Microsoft Platform SDK (PSDK) と呼ばれていたもので、ライブラリ、ヘッダファイル、やサンプルが含まれている。
その役割としては「アプリ作成の手間を減らす」、というよりも、これが無い状態で Windows 上で動くアプリを作成するのは ( 不可能ではないが ) 困難である。
簡単に記すと、Windows SDK の中に「画面に点を打つ」「画面に線を引く」や「ファイルを操作する」といった、頻繁に使われそうな機能からマイナーな機能まで集約されている。

Visual Studio の中にも ある程度のライブラリ、ヘッダファイルが含まれている。が、それらは Windows SDK の簡略版であり、いくらか削られている。

ほか、Visual Studio のバージョンとWindows SDK の組み合わせには相性問題が生じるので要注意。
Visual Studio 2005 ならば Windows SDK 6.0、
Visual Studio 2008 ならば Windows SDK 6.1 もしくは 7.0、Visual Studio 2010 ならば ・・・

ちなみに、Visual Studio Express 2012 以降は何も追加せずに 64ビット向けのアプリを作成することができる。
Visual Studio Express 2012 は Windows Vista 以前の OS をサポートしない。

さてさて、この題目のきっかけとなったブロガーさんは学生とのこと。さらに、当時 Windows XP を利用しているとのことでした。ということで、無償版の Visual Studio 2005 Express Edition もしくは 2008 Express Edition 、に加え WindowsSDK の導入が良い旨を返信しました。当時、2005 Express Edition の入手が難しくなりつつあったので、入手を急ぐように伝えました。

※ Visual Studio 2005 シリーズならば、Windows 2000 や Windows 98 といった古い OS 向けのアプリを組むことも可能。Visual Studio 2005 が登場した時期は、まだ Windows 2000 はサポート期間内でした。

※ Visual Studio 2005 Express に関して、「Visual Studio 2005 Express Edition の提供を 2009 年 3 月 31 日を・・・」とのアナウンスがありました。

アプリの骨格を作る

改良前と改良後の違いを確認できるように、ウィンドウ、もしくはダイアログを表示するのが手っ取り早い。

冒頭と重複するが、この題目のきっかけとなったブロガーさんは、C/C++ 言語の学習に取り組むにあたり、Visual Studio 以外の環境だったようで、
「単純に Window を表示するだけのアプリ」を組む段階で苦労していた感がありました。
C/C++ の学習過程においては、たくさんの教材が出回っていて、どれが近道なのか右往左往するのも当然である。

書籍を出版する側から考えてみれば、その「単純に Window を表示するだけのアプリ」のソースコードを掲載せることでページ数が稼げる。つまり、本の中身が厚くなる。本の厚さと内容の濃さとは別。
文献を読む側から考えれば、長文は気力が失せる・・・

それらのソースコードを丸暗記したいとの想いで、キーボードを叩き続けるのも無駄ではないだろう。
この題目のきっかけとなったブロガーさんは、ソースコードの長さに嫌気がさしていたように見えた・・・

筆者の個人的な意見を言えば、K&R 本 と 「MSDN ライブラリ」 が近道。
Visual Studio を使うのであれば、そのヘルプ機能も頼り甲斐がある。
「MSDN ライブラリ」の原文は英語。ゆえに、以前は誤訳や誤植も目立ったが、昨今でMSDN はネットを経由することもあり改善されてきた。

アプリを作る話に戻ります。
Visual Studio を使えば少ないステップで「単純に Window を表示するだけのアプリ」を構築できる。
--- 以下、Windows 7 , Visual Studio 2008 での例 ---

ツールバーのメニューから、



[ファイル (F) ] -> [新規作成 (N) ] -> [プロジェクト] と進む。
ひな型 (テンプレート) を選択するダイアログが表示されるので、



左側ペインより「Visual C++」を選択、ツリーの中から「Win32」。
右側ペインに「Win32 プロジェクト」が表示されるので選択。

プロジェクト名、ソリューション名の欄を入力して次に進む。
ここでは、参考例としてソリューション名に「new01」と入力しました・・・

Visual Studio 2005 や 2008 の Express エディションにおいて初期状態で「Win32 プロジェクト」が利用できないかもしれません。これに関しては、ネット上に諸々の情報があります。ここでは取り上げません・・・



ウィザード画面では「Windows アプリケーション」が選択されていることを確認。

この辺の画面も Express エディションと多少異なるかもしれません。重複しますが、Express エディション は無償配布されているのとひきかえに「MFC」「ATL」などのライブラリは付属していません。「MFC」の代替としては「WTL」というライブラリもあります・・・

ウィザード画面で設定して、[完了]ボタン等をクリック。



このような感じで、「単純に Window を表示するだけのアプリ」のソースコードやリソースファイルが自動的に作成されます。
キーボードの[F7]ボタンを押せばアプリが作成されます。アプリを実行するにはキーボードの[F5]ボタン。

いざアプリを実行してみると、冒頭の画像と異なり、「Hello World!」は表示されないハズ。
筆者の手元にあるVisual Studio で確認したところ、2002 以降は「Hello World!」を表示しないテンプレートに変更されています。

Visual Studio 6.0 までは、「Hello World!」が表示されるテンプレートでした。
そのコードと比べ、



WndProc プロシージャ内、「case WM_PAINT:」の辺り「// TODO:~~」と「EndPaint( ~~」の間、

RECT rt;
GetClientRect( hWnd, &rt );
DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );

の3行が削られています。
「Hello World!」と表示したい場合、この3行を追加しただけではエラーが発生します。
szHelloに関しては、WndProc プロシージャ内の冒頭、変数定義の辺り「HDC hdc;」と「switch (~~」の間に
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

の2行を挿入し、さらに、ストリングテーブルに「IDS_HELLO」を定義するなどの修正が必要・・・

ちょっと待った。
その前に、Visual Studio に不慣れな段階では
「WndProc って何処」という声があがるのも当然。
そのような時はいちいちスクロールして探す !?!?
それとも、文字列検索!?!?
これも時間を費しそう・・・



統合開発環境ならではの機能を使えば、少し楽になる。
Visual Studio であれば、ドロップダウンリスト ( 図の赤い枠あたり ) をクリックし、「WndProc(HWND ~~」を選択すれば編集したい関数へジャンプできるハズ。

よく見ると、DrawText(~~ の辺り、文字列の長さを求める部分が「strlen」となっています。
Windows 向けのアプリ作成に慣れているヒトならば「lstrlen」「_tcslen」などもご存知のことでしょう。
「strlen」や「strcpy」といった古くから C/C++ 言語の教本に載っている関数、これらを最近の環境で用いると警告が出ます。
この辺は「strlen_s」「strcpy_s」といった具合に末尾に「_s」が付いた関数に変更すると解消されます。
なお、「strcpy」と「strcpy_s」では呼び出しだけでなく、返却値が異なるので変更は慎重に。

「strcpy_s」などの拡張はバッファオーバーフローなどの致命的なエラーを減らす目的があると言われています。
・・・バッファオーバーフローやバッファオーバーランと呼ぶと難しいかもしれません。想定外のメモリアクセスと言い換えても、さらに判り難そうです。おおざっぱに言えば、立ち入り禁止とされている場所に無断で入るようなこと・・・
末尾に「_s」を付けた関数は Visual C++ 独自の拡張であり、標準的な C/C++ 言語の教本には載っていません。
逆に言えば、末尾に「_s」が付く文字列操作の関数は Windows 以外の OS や古いコンパイラで通用しません。

たしかに、旧来からの「strncpy」などの関数があります。これらがあれば「strcpy_s」などが拡張・追加されたことに疑問を抱くのも当然。「strncpy」に対し、「strncpy_s」も追加されたことから察すれば、疑問が解けることでしょう。

ほかにも、プリプロセッサ「#define」で特定の文字列を定義して警告を減らす手段もあります。しかし、単純に警告が通知されないだけであり、致命的なエラーの発生を防ぐことにはなりません。
警告の箇所が少ない段階ならば末尾に「_s」が付く関数に変更するが無難かも・・・

長くなりましたので続きはまた後日・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

検索サイトからお越しの方へ
検索サイトからお越しの方は、ブラウザのアドレス欄vitalaboloveおよび、fc2.comが含まれているかご確認ください。
含まれていない場合、偽サイトを閲覧なされている可能性があります。

偽サイトは、当ブログの文字部分や画像部分が有害サイトへのバナーと置き換わっているようです。
プロフィール

Author:Vitalabolove
ご訪問ありがとうございます。
店長を任されておりますVitalaboloveです。

コメントはお気軽に。
今のところリンクフリーですが、あと数日でとりやめます。

画像データ、文言の引用は事前連絡くださるようお願い申し上げます。事前連絡の際は、左下、メールフォームを経由をご利用ください。

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
カテゴリ
ランキング
いつも応援いただきありがとうございました。ただいま休養中につきランキングへ参加していません・・・

フリーエリア
内緒話などはおきてがみをご利用ください。
月別アーカイブ
メールフォーム
掲載された記事について、ご不明な点はここからお問い合わせください

名前:
メール:
件名:
本文:

最新コメント
最新トラックバック
スパムと思われるトラックバックは削除しました
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。