Category: 覚え書

Visual Studioで作成したWindows Formアプリケーションのインストーラ作成方法を備忘録としてまとめてみた。

 

setup

過去にも自作ソフトを配布する際、何度かインストーラを作成して配布していたこもあったけど、ここ最近は、インストーラを作成せず、exeなどをzipで固めて配布していた。
その方が楽だし、利用者も抵抗感が少ないと思ったから。

でも、たまに実行権限の問題や、スタートアップ登録方法など問い合わせを受けることもある。
場合によっては、インストーラ付きでの配布を求められるシーンもある。
そんな訳で、また忘れてしまうであろうインストーラ作成方法をメモっておくことに。


 

昔はVisual Studioでセットアッププロジェクト(msi形式のインストーラ)を簡単に作成できたけど、
Visual Studio 2012以降では、セットアップ プロジェクトが無くなり、ウィザードでインストーラ作成(ディプロイメント)することが出来なくなってしまった。

当時、困って調べたらセットアッププロジェクトに代わり、InstallShield Limited Editionを使ってインストーラを作れることが分かった。
Excelを使ったプログラムとインストーラの作成

なので、今回もInstallShieldを使って作ろうと思ったんだけど、Visual Studio 2017 Community 2017ではInstallShield Limited Editionが無くなっている。
これからは、やっぱりInstallShieldの時代の時代で、皆さんちゃんと有料版使ってインストーラ作ってくださいって流れなのかな。

でも、何とかコストをかけずに気軽にインストーラ作れないか調べてみたところ、一度無くなった(と思われていた)msi形式のインストーラ作成用のコンポーネント(Visual Studio Installer Projects)が復活していた。
簡単なインストーラしか作成できないけど、これで十分。
だいぶ使い方を忘れてしまったので、自分用のメモとしても使い方を残しておくことに。

 

Visual Studio Installer Projectsの追加

何はともあれ、Visual Studio 2017に、[Visual Studio Installer Projects]を追加してみる。

 
Visual Studioを起動し、[ツール]>[拡張機能と更新プログラム]メニューを開く。
[ツール]>[拡張機能と更新プログラム]
 

「拡張機能と更新プログラム」ダイアログが表示されるので、画面左側のツリーから「オンライン」を選択し、画面右上の検索ボックスで「Installer Projects」を指定し検索。
すると、「Microsoft Visual Studio 2017 Installer Projects」が引っ掛かるので、これを「ダウンロード」。
Microsoft Visual Studio 2017 Installer Projects
 

ダイアログと、Visual Studioを閉じるとインストールが始まる。
インストール
 

これでVisual Studio Installer Projectsのインストールは完了。
Visual Studio Installer Projectsのインストール完了
 

Windowsアプリケーションの作成

こちらは、既に作成済みと思うので割愛。
 

参考:
Hello World!作成

 

インストーラ作成

そして、ここから今回の肝となるインストーラの作成の手順。
 

  1. ソリューションを開く
    Visual Studioを起動し、あらかじめ作成したWindowsアプリケーションを開く。
    (または、エクスプローラーからソリューションのファイル *.sln ダブルクリック)
    Windowsアプリケーションを開く
     

  2. プロジェクトの追加
    画面右側にある「ソリューションエクスプローラー」のツリー一覧の中から、一番トップにある「ソリューション」を右クリックし、ポップアップメニュー「追加」>「新しいプロジェクト」を選択。
    「追加」>「新しいプロジェクト」
     

  3. プロジェクトの種類選択
    「Setup Project」を選択し[OK]ボタン押下。
    Setup Project

     
    すると、ソリューションの中に作成したセットアップ用のプロジェクトが追加される。
    Setup1が追加される
     

  4. ファイルシステムの編集
    まずは、ファイルシステムから設定を行う。
    上記流れで、既に「Files System(Setup名)」タブが表示されていると思うが無い場合は、「ソリューションエクスプローラー」のセットアップ(Setup1)を右クリックし、ポップアップメニューで[View]>「ファイルシステム」を選択すると表示できる。
    ファイルシステム
     

    最初に以下の3つのフォルダが用意されている。
    主な役割は以下のような感じ。

    • Application Folder
      作成したアプリケーション(exe,dllなど)のコピー先などをここで指定する。
      “C:\Program Files\ApplicationName\Application.exe”など

    • User’s Desktop
      ユーザーのデスクトップにコピーするものを指定。
      プログラムのショートカットなどあれば指定。
      デスクトップに配置

    • User’s Program Menu
      ユーザーのプログラムメニューに追加するものを指定。
      プログラムのショートカットなどを指定。

     

  5. アプリケーションフォルダの設定
    「Application Folder」を右クリックし、ポップアップメニュー[Add]>[プロジェクト出力]を選択。
    プロジェクト出力
     

    「プロジェクト出力グループの追加」ダイアログが表示されるので、そこで「プライマリ出力を選択。
    すると、Windowsアプリケーションで作成したexeやdllなどをインストール対象として含んでくれる。
    あと「構成」は「Release」を選択。
    プロジェクト出力グループの追加
     

    exeなど以外にも、例えばヘルプファイルや、Readmeなどもインストールに含めておきたい場合、同様に、[Application Folder]を右クリックし、ポップアップメニュー[Add]>[ファイル]を選択。
    そこで、ヘルプファイルやReadmeファイルなどを指定し追加。
    ヘルプファイルやReadmeファイルなどを指定し追加
     

  6. ユーザーのデスクトップの設定
    デスクトップにアプリのショートカットを作成したい場合などは、こちらを編集する。
    今回は割愛。やり方は次の「ユーザーのプログラムメニューの設定」とほぼ同じ。
     

  7. ユーザーのプログラムメニューの設定
    今度はWindowsのスタートメニューに登録する情報を設定する。
     

    「User’s Programs Menu」を右クリックし、ポップアップメニュー[Add]>[Folder]を選択。
    User's Programs Menu
     

    フォルダ名を変更。(今回はアプリケーション名である”RSS速報”という名に変更)
     

    更に、作成したフォルダが選択された状態で、右側のListView画面を右クリックし、ポップアップメニュー[新しいショートカットの作成]を選択。
    新しいショートカットの作成
     

    「Select Item in Project]ダイアログが表示されるので、そこでリストの中から”Application Folder”を選択後、”プライマリ出力 from ~(Release Any CPU)”を選択し[OK]押下。
    Select Item in Project
     

    メイン画面に戻り、追加された”Shortcut to プライマリ出力 from ~”を選択し、画面右側のプロパティで、[Name]を上記名前から、任意のショートカット名に変更する。
    (ここでは、アプリ名の”RSS速報”に改名)
    Name
     

    次に、表示するアイコンも変更する。
    上記、[Name]同様に、プロパティの一覧にある[Icon]をダブルクリック。
    表示された「Icon」ダイアログの[Browse…]ボタンを押下し、
    Icon
     

    「Select Item in Project」ダイアログで、アイコンの参照先である”Application Folder”をダブルクリック後、[File of Type]で”Execute Files(*.exe)”を選択。
    すると一覧に”プライマリ出力 from ~(Release Any CPU)”などが表示されるので、これを選択し[OK]押下。
    Select Item in Project
     

    [Icon]ダイアログに戻ると、exeファイル内にあったアイコンが表示されているので、このアイコンを選択し[OK]押下。
    Icon
     

    これで、exeのショートカットがプログラムメニューの方にも登録された。
     

    更に、ヘルプ、Readme追加も同じような感じで設定する。
    Readme
     

    これで必要最小限の設定は完了。
     

  8. 名前の変更
    最後に、セットアッププロジェクトのプロパティを一部修正する。
     

    [ソリューション エクスプローラー]で”Setup1″を選択し、その下のプロパティ一覧で必要に応じて以下の情報を修正する。
     

    ・Author
    ・Manufacturer
    ⇒これらメールアドレスだったので必要に応じて修正
     

    ・ProductName
    ・Title
    ⇒セットアップのプロジェクト名から、アプリケーション名に変更(今回は”Setup1″⇒”RSS速報”)
    Author
     

  9. インストーラを作成
    設定が終わったので、いよいよインストーラの作成。
    「ソリューション エクスプローラー」で今回作成したセットアッププロジェクト(ここでは”Setup1″)を右クリックし、ポップアップメニュー[ビルド]を選択。
    ビルド
     

    これで、Setup1\Releaseフォルダ配下にも、”setup.exe”と”Setup1.msi”ファイルが作成される。
    etup1.msi
     

  10. インストーラの実行(テスト)
    作成されたインストーラを試す場合、”setup.exe”を実行してみる。(msiが使えるPCであればmsi側でもOK)
    それか、先ほどのVisual Studio上で”Setup1″のプロジェクトを右クリックし、ポップアップメニュー[インストール]を実行してみてもOK。
    インストール
    インストール
     

    セットアップウィザードへようこそ
    セットアップウィザードへようこそ
     

    インストールフォルダの選択
    インストールフォルダの選択
     

    インストールの確認
    インストールの確認
     

    インストールが完了しました。
    インストールが完了しました。
     

    これでインストール完了。
    プログラムメニューにも登録されている。
    プログラムメニュー
     

    アンインストールする場合は、インストール時同様、Visual Studio上のポップアップメニューから「アンインストール」を選択するか、再度、エクスプローラーから”setup.exe”を実行するか、一般のアプリ同様、コントロールパネル>プログラムのアンインストールから実行する。

 
 

C#で、Windowsフォームの角を丸くして表示する方法。
 

普通のWindowsフォームは、タイトルバーとか境界線が付き、角も角ばっている。
角ばったWindowsフォーム

 

それを、こんな感じに角を丸くして表示する。
フォームの角を丸くする

 
(さらに…)

開発環境をVisual Studio Community 2013から、
Visual Studio Community 2015に切り替えてみた。
Visual Studio Community 2015
 

[Microsoft:無料開発ツール – Visual Studio Community 2015]
https://www.visualstudio.com/products/visual-studio-community-vs
 

(さらに…)

スタートアップメニューにショートカットを登録

Windows起動時にアプリを起動させたい場合、スタートアップメニューにアプリを登録することは良くあると思う。

でも、Windows 10や8.1などでは、スタートアップメニューへの登録方法が面倒というか分かりにくく、自作ソフトでもたまに問い合わせが来る。

インストーラでスタートアップに登録すれば確実なんだけど、フリーソフトでインストーラとかは嫌がられる場合も多く、作る手間も掛かる。

そんな訳で、アプリケーション側で、自分自身のショートカットをスタートアップメニューに登録する方法を調べてみた。

 
 

まずは、スタートメニューのフォルダを調べる方法。

// 特殊ディレクトリ(スタートアップ)のパスを取得する
Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

Stringの値が返される。
例)C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Windows\Start Menu

 
 

そして、アプリ自身のexeファイル名の取得方法。

Path.GetFileName(Application.ExecutablePath)

Stringの値が返される。
例)sampleApl.EXE

 
 

あとは、exeのショートカットをスタートメニューのフォルダにコピーするだけ。

・・・。

あれ、どうやらC#やVB.NETではファイルのショートカットを作る機能が無いっぽい。

 

そういえば、前も似たようなことをやった記憶が。。

そうだ、これだ。
[C#] 送るメニューにショートカットを登録/解除する方法

この時も、ショートカット作成に苦労した。

なので、ショートカットの作成は、上記記事の「方法4」を流用し、WSH(Windows Script Host)でショートカットを作成する。
いろいろ方法があるので、詳しくは上記記事を参照。
(さらに…)

YouTube

 

突然、子供が使っているiPod TouchでYouTubeが使えなくなってしまった。

何だかYouTubeをアップデートしたら、アプリのアイコンが消えたと。

そして、App Storeから検索&ダウンロードしなおそうとしても、クラウドマークというか雲のマークのボタンにマスクが掛かりダウンロードできないと。

(さらに…)

ListViewコントロールで、詳細表示(ViewプロパティをDetails)し、アイテムを追加していくと描画処理が異常に重くなる現象が発生。
この問題を解決するのに少しハマったので覚書としてメモっておく。

自作ソフトRSS速報のListView表示で、数十件の項目を表示するのに数分かかることもある。

ListView
描画時にGUIがほぼ固まってしまう。

遅い処理部分をデバッグで調べてみると、

ListViewItem lItm = listView1.Items.Add(FormMain.saveItems[i, j, 0]);

の行で、数秒が掛かっている。
しかも、件数が増えれば増えるほど遅くなっていく。
(さらに…)

エクスプローラーなどでファイルを右クリックしたときに出てくる「送る」メニュー。
この送るメニューにアプリケーションを登録しておくと、選択したファイルの情報を
アプリケーションに渡して起動できるため、使い方によっては便利な機能。
01
例えば、logファイルを”メモ帳”に送って起動するといったことができる。

(さらに…)

ごくたまに画像ロゴを作成するためにGIMPを使用する。
割と簡単にカッコいいロゴを作れるため重宝している。

GIMPでロゴ作成

 

だけど、そこそこ種類があって、どのメニューがどういうロゴだか忘れてしまう。
なので備忘録的にGIMP2.8のサンプル ロゴ画像を載せておくことに。

 

と、その前にロゴ作成方法。

GIMPでロゴ作成

  1. GIMPを起動
  2. [ファイル]→[画像の生成]→[ロゴ]メニュー配下の任意のサブメユーを選択。

(さらに…)

C#でExcelファイルを読み書きするプログラムと、そのプログラム(exe)を配布するためのインストーラを作ってみた。

C#でExcelファイルを読み書きするプログラム
何故態々インストーラを作成するのか?

それは、作成したExcelを使ったプログラムは、exeの配布だけでは他のPCでは動かないため。
Excel関連のDLLも一緒に配布する必要がある。

例えば、前に作成したサンプルアプリの場合、配布時は以下のDLLが必要。

  • Microsoft.Office.Interop.Excel.dll
  • Microsoft.Vbe.Interop.dll
  • office.dll
  • stdole.dll

 

⇒これ、後から気づいたけど実は認識誤り(.NET Framework 3.5までの話)。
 .NET Framework 4以降ではDLL配布を不要にする方法がある。
 説明も後記するので最後までちゃんと読んでね。

 

昔のVisual Studioではセットアッププロジェクト(Windows ベースのアプリケーションのmsiインストーラ)を作成する際、必要なDLLを自動で抽出してくれていた。

インストーラ付きで配布するのが嫌という場合、exeと抽出されたDLLだけを他PCにコピーしても動作する。
ただ、インストーラ無しで、抽出されたDLLを勝手に再配布するのはNGかも知れない。
あと、勿論、配布先PCにもMicrosoft Excelをインストールしておく必要はある。

じゃぁ、昔みたいにインストーラを作ればいい。

と、思ったら、、
Visual Studio 2012以降では、セットアップ プロジェクトが無くなり、ウィザードでインストーラ作成(ディプロイメント)することが出来なくなってしまったらしい。

・・・それは困った。

必要なDLLはMSDNとかに載っているかもしれないけど、前と同じような方法ができないか調べてみた。

 

すると、従来のセットアッププロジェクトに代わり、InstallShield Limited Editionを使ってインストーラを作れることが分かった。
でも、InstallShieldって有料じゃなの?

と思ったけど、このLimited Editionってのは簡易版で無料らしい。

ただ、無料版のVisual Studio Expressでは使えず、Visual Studio Professional以降じゃないと、InstallShield Limited Editionは使えないようだ。

 

という事で、おさらいも兼ねてVisual Studio 2013を使ってExcelを使ったプログラムと、インストーラをInstallShieldで作ってみることにした。

 
 

Excel用のプログラム作成

まずは、C#でExcelを使ったプログラムを作成。
exeの作成方法は、ほぼ前回と同じ。
(さらに…)

C#やVB.NETなどのアプリケーションで、WebサイトやHTMLなどを表示したい場合に使うWebBrowserコントロール。
このWebBrowserコントロールを使えば、簡単にInternet Explorer同等のWebページを表示できる。

でも、最近このWebBrowserコントロールで表示崩れが増えてきたような気がする。

例えば、ここのホームページを表示すると、メニューのスタイルが崩れてしまう。

 

↓WebBrowserコントロールで表示
WebBrowserコントロールで表示

 

(さらに…)

Windows NT/2000/XPの頃、NET SENDコマンドを使って、簡単に他のPCに対してメッセージボックスを通知することができた。
送られてきた方は、急にメッセージボックスが表示され、結構ビビるのだが。

昔、この仕組みというかサービスを利用したフリーソフトを作ったこともあった。

でも、Windows XPでは、”Messenger”サービスが起動していないと使えなくなり(デフォルトは停止)、更にVista以降では、”Messenger”サービス自体が消え、この方法でメッセージ通知することができなくなった。

 

その代わりに、IP Messengerなどのフリーソフトを使う方法もあるけど、相手側もIP Messengerを起動しておかなければならない。

で、いろいろ調べてみたら、Vista以降では、msgってコマンドってのが使えるらしい。

 
 

試しに、コマンドプロンプトから以下のようなコマンドを打ってみる。

msg.exe    (userid)    "(message)"

 userid・・・WindowsログインユーザID
 message・・・表示したいメッセージ

 
例)
msg   osada   “テストメッセージ”

 

すると、指定したユーザー(osada)にメッセージ「テストメッセージ」が通知される。
メッセージボックス「Test Message!」
(さらに…)

iTunes11が11/30に公開されました。
今回はUIを中心に大幅にリニューアルされたということで、早速ダウンロード。
iTunes11
iTunes10はWindowsのUIと異なるせいか、なんか使いにくい。
それが少し改善されているような気がする。
(さらに…)

C#でHTML文書からRSSのURLを取得するサンプル。

このサンプルでは以下の処理を行う。
1.テキストボックスに対象となるHTML(WebサイトのURL)を指定。
2.[RSSのURL取得]ボタン押下。
3.取得したRSSが表示される。
(さらに…)

解約後の携帯ソフトバンク 3G携帯の機種変更後のカメラ使用方法について
先日、iPhoneに機種変したけど、iPhoneの前は、910SH(SHARP)を使用していた。

この旧3G携帯、500万画素のデジカメが付いていて気に入っていたが、携帯解約すると、USIMカードが無くなるのでカメラも使えなくなってしまう。
カメラを起動すると、
「この機能は現在利用できません。ネットワーク自動調整を行ってください。」
と表示される。
(さらに…)

前回のカラーコードを16進数表示するに続き、今回はその逆の16進数文字列からカラー値を求めるサンプルを紹介。

このサンプルでは以下の処理を行う。

  1. テキストボックスに16進数6桁のRGBの値を指定
  2. ボタンをクリックで、ボタンの背景色を指定カラーに変更
  3. ついでにボタンの文字列も色を反転

GUIデザインでは、Formにbutton2という名前のボタンと、textBox1という名前のテキストボックスを貼り付ける。

(さらに…)

C#でカラーの値をRGBカラーコードを表示するサンプル。

このサンプルでは以下の処理を行う。
1.「色の設定」ダイアログを表示。
2.設定した色を使用し、ボタン背景色を変更
3.ボタンの文字色を、背景色の反転カラーに変更
4.設定した色をRGBカラー(16進数6桁の文字列)として表示

GUIデザインでは、Formにbutton1という名前のボタンを貼り付ける。
カラー変更 デザイン

(さらに…)

最近、Windows標準のShift-JISから、Web標準となっている(?)UTF-8への文字コード変換が必要な場合がちらほら出てきている。

マルチプラットフォームでデータをやり取りする場合なんかでもUTF-8が結構使われていたりする。

こういうコード変換なんかは、テキストエディタ等を使えば、簡単に変換できる。
最近ではメモ帳でもUTF-8保存ができるようになったし。

でも、このコード変換が100個、1000個、と数が増えてくると手作業は無理。

そんな訳で、VC++(非.NET)でSJISからUTF-8に変換するプログラムを作ってみることにした。
# バッチで利用したいという理由もあったんで。

しかし、SJISからUTF-8に直接変換するようなWin32APIは用意されていないことに気付いた。
C#やVB.NETならきっと一発で変換できるんだろうけど(多分)。

調べてみると、シフトJISからUTF-8に変換するためには、一回Unicodeに変換させる必要があることが分かった。
あぁ面倒。

まず、MultiByteToWideCharを使用し、SJISからUnicodeへ。
次に、WideCharToMultiByteを使用し、UnicodeからUTF-8へ。

出来上がったプログラムソースは以下のとおり。
(さらに…)

HTMLでサムネイル画像の拡大する方法はいくつかあると思うが、今回はJavaScriptをあえて使用せずCSS(スタイルシート)のみで、画像を拡大してみる。

CSSなら、JavaScriptを自由に使えないブログなどでも簡単に利用できるメリットがある。
# ただし、CSSに対応した割と新しいWebブラウザが必要となる。多分。

サンプルは↓こちら。
# マウスポインタを重ねるとサムネイル画像が拡大表示








覚書き程度ということで、いきなりHTMLソース。
(さらに…)

職場でのお話なんだけど、ノートPCの盗難や、自宅へ持ち込んでウィルスに感染する人がちらほら出てきてセキュリティー対策にうるさくなってきた。

以前はノートPCにBIOSパスワードを仕掛けるぐらいで済んでいたけど、今度はデスクトップPCに対してもBIOSパスワードと、更にハードディスクパスワードを掛けるよう指示が出た。
ウィルスチェックも毎日、完全スキャンするという指示も。

仕事で使用しているPCなんで仕方ないが、これって的を得ているとは思えない。
ウィルスチェックなんかは、完全スキャンなんかすると、マシンによっては5時間以上かかるのもある。
これはさすがに見直され週1回でいいという話にはなったが。。
BIOSパスワード。
これって、盗難されたときのためにパスワードを設定しましょうという話だけど、同じ機種同士なら差し替えたり、ハードディスク(情報)だけ別マシンに付けてしまったり、電池を一回外すだけでリセットされてしまったり、ハードによって異なるらしいけど、抜け穴がいっぱいあるらしい。
BIOSパスワードの解除方法を伝えたいのではなく、BIOSパスワードで安心している人がいたら注意しましょうというお話です。

で、BIOSパスワードだけでは不安なので、今度はHDDパスワードを付けましょうという話になったんだけど、これがまたクセモノ。
職場内で一斉にHDDパスワードかけたはいいが、翌日パスワード忘れが続出。
あちこちで「ピーピー」ビープ音(パスワード3回間違え?)が鳴っている。
物凄いプロフェッショナルな方々なんだけどなぁ。。。

自分はHDDパスワード忘れた場合の対処方法は分かりません。
多分、もう二度と使えなくなってしまうのではないかなと。
なので、HDDパスワードは忘れないように注意しましょう。
でも、付箋紙に書き込んでおくなんて問題外でしょう。
引継ぎする際も忘れずに。

そもそも、デスクトップPCなんて滅多に盗難されんでしょう。
盗まれたくないなら、パスワードじゃなくって物理的にワイヤー錠でガッチリガードすべきだと思うんだけどなぁ。
出入り口の監視カメラで抑止とか。

今回も自分用の覚え書きネタ。

Webサイトの更新日時なんかを調べたい場合、URLに以下を入力するとメッセージボックスが表示される。
もちろん、動的に作成されるWebページは正しく取得できない。

javascript:alert(document.lastModified)


# とある件で更新日時を調べたくなったけど、やり方忘れて少し苦労したのでメモ。

かつてVisual Basic 6.0にはコントロール毎にIndexプロパティが存在し、
簡単にコントロールの配列を扱うことができた。
例えば、

TextBox1(0).Text = "1"
TextBox1(1).Text = "2"

など。

が、VB.NETからIndexプロパティが無くなり簡単には使用できなくなった。
(正確に言うと互換のため残されているが)
オブジェクト指向なんだから自分で作れと言わんばかりに無くなっている。

VB.NETにも無いものはC#にも無い。
C# 2005にも配列用のコントロールは用意してあるようだけど。
(例:TextBoxArray、PictureBoxArrayなど)

で、いざコントロールを配列で使ってみようと思ったところ使い方が分からず
少し悩んでしまった。
またきっと忘れるんで覚書きに追加しておこう。
(さらに…)

最近よく度忘れするので覚書き

C#でデバッグ時に[出力]ペインに情報を書き出す方法
1. Debugモードに切り替え
2. ソース中に
  System.Diagnostics.Debug.WriteLine(“出力される文字”);
3. 実行

前に、とある処理でこんなコーディングをしたことがあった。

// 別スレッド
UINT sampleThread(LPVOID pParam)
{
  CSampleDlg* pDlg = (CSampleDlg*)pParam;
  for( ; 0<pWait ; pWait--){
    // ループ内の処理
  }
  :
}

しかし、これが何故か無限ループに陥ってしまう。
同様のミニプログラムを作成しても再現しない。
なぜか、これを使用している某プログラムのみ発生する。

でも、デバッグモードでは問題なく動作する。

う~ん、怪しい。
試しにこのスレッド処理だけをコンパイラの最適化を無効にしてみた。

// 別スレッド
#pragma optimize( "g", off )
UINT sampleThread(LPVOID pParam)
{
  CSampleDlg* pDlg = (CSampleDlg*)pParam;
  for( ; 0<pWait ; pWait--){
    // ループ内の処理
  }
  :
}
#pragma optimize( "g", on )

すると動くではないか。。。

最適化によってコードのサイズを小さくし実行速度を向上しているようですが、
たまに、こういった不具合にも突き当たります。
# 不具合というか仕様なんでしょうけど。

前に、最適化有無によって倍精度浮動小数点の演算結果(べき乗)が異なるって問題にもぶち当たったことがあったけど、これも最適化有無によるものでした。
浮動小数点の値自体、もともと誤差を含んでいるので、どちらも正しい値なんですが。。。

ちなみに、あとから分かったことは、

for( ; 0<pWait ; pWait--){

for(wkWait=pWait ; 0<wkWait ; wkWait--){

に変更するだけで問題は解決しました。

よく上級の人のソースや、本で、

for(;;)

なんて書き方も紹介してますが、あまり懲りすぎると痛い目にあいます。
特に、複数人で開発している製品なんかは、他人にも分かりやすいコーディングをしなければ、バグ作り込みの原因にも成りかねません。
あまり、性能に影響が無い部分は、なるべく見やすい一般的なコーディングをした
方がよいのでしょう。

最近、物忘れが激しいんでブログに書いておきます。

Windows XPで、ネットワークスピードを調べる方法

知っている限りでは二種類の方法があります。

  • 其の壱
    1. [Ctrl]+[Shift]+[Esc]キーを同時押下。
    2. Windowsタスクマネージャのダイアログが表示されるので[ネットワークタブ]を選択。
    3. 右側のスクロールバーを上下することにより、各アダプタのネットワーク使用率を表示することができる。

(さらに…)