InteliSense が利用できない [開発環境]
msdnのサイトに詳しい説明があります。
http://msdn.microsoft.com/ja-jp/library/vstudio/ks1ka3t6.aspx
そしてこの説明を参考に調査したけど解決できません。そして.ncbファイルの存在を知りますが、プロジェクト中にはありません。さらにググると驚きの記述が。。。
「Visual Studio 2010ではC++/CLI でインテリセンスが利用できない!」
.NETの場合はVBかC#を使えということでしょうか?とりあえず「Visual Studio 2008 C++ Express Edition」で開発することに。
インテリセンス効きます。やはりコーディングスピードが違います。
参考サイト
boost を Windows で使う [開発環境]
1.boostとは
Boostで公開されるライブラリはコミュニティの公開レビューによって精選されている。使用にあたっては商用、非商用を問わず無償のBoost Software Licenseの下でライセンスされる。
Boostはテンプレートなどを活用して積極的にメタプログラミングやジェネリックプログラミングを取り入れていこうという傾向がある。そのためBoostライブラリの利用者はしばしばC++の現代的なアプローチに精通していることを求められる。
「Wikipediaより」
2.インストール
ビルド済みのバイナリインストーラが以下のboostproサイトから入手できますが。今回はプロジェクト一式をダウンロードし手動でビルドおよび環境設定を行うことにします。
① ダウンロード
以下のサイトから入手します。
旧バージョンは以下から入手します。今回 Version 1.51.0 を使うので、ここから”boost_1_51_0.zip”をダウンロードし解凍します。
② インストール
コマンドプロンプトから解凍後のディレクトリに移動し”bootstrap.bat”を実行します。
b2.exe と bjam.exe が生成されます。
③ ビルド
以下のコマンドおよびインストールが行われます。
> b2.exe install –j2 –prefix=c:\boost
これ”C:\boost”にインストールが開始しました。
3.Visual C++ から使う
① インクルードパスの設定
Visual Studio のメニューから「プロジェクト」、「プロジェクトのプロパティ」を選択し、プロジェクトのプロパティページを表示する。
このプロパティのページから「VC++ディレクトリ」、「インクルードディレクトリ」、「<編集>」と選択する。
インクルードディレクトリダイアログが起動したら、「新しい行」ボタンを押し、追加された行にboostのインクルードディレクトリを設定する。
② ライブラリパスの設定
ライブラリディレクトリについても同様に設定する。
③ 関数を使う
後は、使うライブラリ用のヘッダーを宣言する。
#include <boost\format.hpp>
例えば、boost用のformatを使う場合は以下のように記述すればOK.
std::cout << boost::format("%3% %2% %1%") %"!" %"world" %"hello" << std::endl;
ライブラリリストは以下のサイトに詳しい。
参考サイト
- http://ja.wikipedia.org/wiki/Boost
- https://sites.google.com/site/boostjp/howtobuild
- http://www44.atwiki.jp/bokuyo/pages/86.html
Visual Studio 2010 ビルド後イベントの設定方法 [開発環境]
DLL用プロジェクトの動作確認やデバッグ時に、ビルド後のDLLファイルを呼び出し側のEXEプロジェクトフォルダにコピーする機能について調べた。この機能はVisual Studioの持つ機能を利用して実現できるらしいので、その設定方法について説明する。
1.「プロパティ ページ」ダイアログ
メニューから「プロジェクト」、「プロジェクトのプロパティ」を選択し、プロジェクトのプロパティ ページダイアログを起動する。
2.コマンドラインの選択
「構成プロパティ」、「ビルド イベント」、「ビルド後イベント」、「コマンド ライン」と選択する。
3.「コマンドライン」ダイアログ
コマンドラインを選択し、「[▼]ボタン」、「<編集…>」を押し、コマンドラインダイアル後を表示する。
4.コマンドの生成
「マクロ」ボタンを押すと現れるマクロと入力で以下のコマンドライン文字列を作成する。
copy "$(TargetPath)" "..\..\UserCheck\Release"
5.確認
メニューからビルドを実行すると生成されたDLLファイルが、EXE用プロジェクトのReleseフォルダーにコピーされた。
Debug側にも下記コマンドラインを登録しておくこと。
copy "$(TargetPath)" "..\..\UserCheck\Debug"
注意:
パスをダブルクォーテーションで囲むことが重要、付けないと ”error MSB3073 exited with code 1”エラーで苦しむことに!
参考サイト
- https://forums.embarcadero.com/thread.jspa?threadID=74898
- http://kronoseed.blog43.fc2.com/?mode=m&no=42
- http://suzume.nemuly.net/programming/%E3%82%82%E3%81%A3%E3%81%A8visual%20studio
管理者権限を持っているか確認[C/C++] [開発環境]
管理者権限の有無によって処理を変える処理を行いたいので、管理者権限を持っているか確認する方法を調べた。
検索するとIsUserAnAdminを使う例がたくさん出てきたが自分の環境(Windows7)では管理者権限を確認できなかった。そこでCheckTokenMembershipを使う以下のコードを使ったら管理者権限を確認できた。
#include "stdafx.h"
#include <Windows.h>
BOOL IsAnAdmin(VOID)
{
BOOL b = FALSE;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if(b) {
if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) {
b = FALSE;
}
FreeSid(AdministratorsGroup);
}return(b);
}int _tmain(int argc, _TCHAR* argv[])
{
if(IsAnAdmin())
printf("管理者権限で起動しました\n");
else
printf("通常権限で起動しました\n");
getchar();return 0;
}
セキュリティ識別子(SID)を割り当て、最大8つの副権限(サブオーソリティ)を使って初期化します。
指定した SID(セキュリティ ID)がアクセストークン内で有効になっているかどうかを調べます。
「SID(Security Identifier。セキュリティ識別子)」と呼ばれる一意のID番号列を使用して管理されている。
参考サイト
- http://sideseeker.hateblo.jp/entry/2012/08/26/201846
- http://togarasi.wordpress.com/2009/02/25/administrator-%E6%A8%A9%E9%99%90%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%81%84/
- http://www.atmarkit.co.jp/fwin2k/win2ktips/307sid/sid.html
.NETでのマルチスレッドプログラミング [開発環境]
1. 種類
◆スレッド(Thread)
Threadクラス(System.Threading名前空間)は、指定したメソッドを別スレッドで起動(実行)する仕組みを提供する。スレッドの一時停止や中断、優先順位付けなどを細かく制御することもできる。
ただし、サーバ型のプログラムのように、リクエストを並行して処理するようなプログラムの場合、スレッドの生成・破棄を大量に繰り返す必要が出てくる。スレッドの生成にはそれなりのリソースが消費されるため、単純にこれを繰り返していてはパフォーマンスが低下する。
メリット
・ 各スレッドに優先順位を設定できる
・ スレッドの一時停止/再開/中断を行うことができる
デメリット
・ スレッドの作成と破棄を繰り返すとパフォーマンスが落ちる
・ メソッドにパラメータを設定できない
・ メソッドの戻り値を得るのが困難
◆スレッドプール(ThreadPool)
スレッドプールとは、キューに入れられたリクエスト(処理)をスレッドプールが用意しているスレッドにより次々に実行していく仕組みである。
スレッドプールでは、一度確保したスレッドのリソースをできる限り再利用するように設計されている。そのため、別スレッドで実行したいメソッドを、スレッドプール専用のキューに次々と入れる(登録する)だけで、後は自動的に登録したメソッドが別スレッドで効率よく実行されていく。
メリット
・ 効率よく複数のスレッドを実行できる
・ object型のパラメータを1つだけ設定できる
デメリット
・ パラメータがobject型1つのみ
・ メソッドの戻り値を得るのが困難
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆デリゲート(BeginInvoke)
内部的には先のスレッドプールを利用している。しかし、デリゲートによるメソッドの呼び出しは、通常のメソッドの呼び出しと同様にパラメータや戻り値を持つことができる。
デリゲートは「メソッドの呼び出しをラッピングしたもの(包んだもの)」と理解してよい。メソッドをデリゲートでラッピングすると、デリゲートに登録したメソッドを、デリゲートを通じて間接的に呼び出すことができる。これは「メソッド呼び出しの仮想化」と呼ばれる。
複数のメソッドを1つのデリゲートに登録して一度に呼び出したり、登録したメソッドを動的に入れ替えたりすることができ、デリゲートはアプリケーションの設計上極めて便利に働く。
デリゲートに登録されたメソッドを実行するには、普通に実行するInvokeメソッドのほかに、別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる(これらのメソッドはデリゲート・オブジェクトが持つメソッドである)。BeginInvokeメソッドを使用する場合には、デリゲートは上述したスレッドプールを利用して、登録されたメソッドを実行するという仕組みになっている。
メリット
・ メソッドに型のあるパラメータを指定できる
・ 簡単に戻り値を得ることができる
デメリット
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆タイマー(Timer)
一定期間ごとにスレッドを呼び出して、指定した処理を実行させる特殊なマルチスレッドの実現方法として、「タイマー」(Timerクラス)という方法
メリット
・一定時間間隔でメソッドを実行することができる
デメリット
・スレッドプールがいっぱいだとうまく動作しない
2. Threadクラスによるマルチスレッド
Imports System
Imports System.ThreadingPublic Class List1_1
Public Shared Sub Main()
Dim threadA As New Thread( _
New ThreadStart(AddressOf ThreadMethod)) ' (1)threadA.Start() ' (2)
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" B ")
Next i
End Sub' 別スレッドで動作させるメソッド
Private Shared Sub ThreadMethod()
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" A ")
Next i
End SubEnd Class
参考サイト
VBプログラミングチップス(文字列操作) [開発環境]
◆Convert メソッド
- ChangeType オーバーロード。 指定したオブジェクトと等価の値と指定した型を持つObject を返します。
- FromBase64CharArray base 64 の数字で構成される Unicode 文字配列の指定サブセットを等価の 8 ビット符号なし整数の配列に変換します。パラメータにより、入力配列のオフセットとしてのサブセットと、変換する配列の要素の数が指定されます。
- FromBase64String base 64 の数字で構成される指定した String 形式の値を等価の 8 ビット符号なし整数の配列に変換します。
- GetTypeCode 指定したオブジェクトの TypeCode を返します。
- IsDBNull 指定したオブジェクトの型が DBNull かどうかを示す値を返します。
- ToBase64CharArray 8 ビット符号なし整数の配列を等価の base 64 の数字で構成される
- Unicode 文字配列サブセットへ変換します。パラメータにより、入力配列および出力配列のオフセットとしてのサブセットと、変換する入力配列の要素の数が指定されます。
- ToBase64String オーバーロード。 8 ビット符号なし整数配列の値を、base 64 の数字で構成される等価の String 形式に変換します。
- ToBoolean オーバーロード。 指定した値を等価のブール値に変換します。
- ToByte オーバーロード。 指定した値を 8 ビット符号なし整数に変換します。
- ToChar オーバーロード。 指定した値を Unicode 文字に変換します。
- ToDateTime オーバーロード。 指定した値を DateTime に変換します。
- ToDecimal オーバーロード。 指定した値を Decimal の数値に変換します。
- ToDouble オーバーロード。 指定した値を倍精度浮動小数点数に変換します。
- ToInt16 オーバーロード。 指定した値を 16 ビット符号付き整数に変換します。
- ToInt32 オーバーロード。 指定した値を 32 ビット符号付き整数に変換します。
- ToInt64 オーバーロード。 指定した値を 64 ビット符号付き整数に変換します。
- ToSByte オーバーロード。 指定した値を 8 ビット符号付き整数に変換します。
- ToSingle オーバーロード。 指定した値を単精度浮動小数点数に変換します。
- ToString オーバーロード。 指定した値を、それと等価な String 形式に変換します。
- ToUInt16 オーバーロード。 指定した値を 16 ビット符号なし整数に変換します。
- ToUInt32 オーバーロード。 指定した値を 32 ビット符号なし整数に変換します。
- ToUInt64 オーバーロード。指定した値を 64 ビット符号なし整数に変換します。
参考サイト
Marshal.PtrToStructure メソッド (IntPtr, Type) VBコーディングで悩んだこと [開発環境]
C#版のサンプルコードを参考にVBでコーディングしても、期待した結果が得られなかった原因がMarshal.PtrToStructure の使用方法にあったので記録しておく。
CTypeを使用し、指定の構造体型に式を変換する必要があった。
' マネージ構造体を作成し、アンマネージ メモリに転送した後、PtrToStructure メソッドを使用してマネージ メモリに再度転送するコード例。
Imports System
Imports System.Runtime.InteropServices' 構造体
Public Structure Point
Public x As Integer
Public y As Integer
End Structure
Module Module1Sub Main()
' 構造体の宣言
Dim p As Point
p.x = 1
p.y = 1Console.WriteLine("The value of first point is " + p.x.ToString + " and " + p.y.ToString + ".")
' 構造体用のアンマネージメモリを確保
Dim pnt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(p))Try
' 構造体をアンマネージメモリにコピー
Marshal.StructureToPtr(p, pnt, False)' 別の構造体宣言
Dim anotherP As Point' アンマネージデータをマネージ構造体にマーシャリング(データ変換)
anotherP = CType(Marshal.PtrToStructure(pnt, GetType(Point)), Point)
' C#の場合、以下の記述となるので要注意
' anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));
' または
' Marshal.PtrToStructure(pnt, anotherP.GetType());
' となるので注意Console.WriteLine("The value of new point is " + anotherP.x.ToString + " and " + anotherP.y.ToString + ".")
Finally
' アンマネージメモリの解放
Marshal.FreeHGlobal(pnt)
End TryConsole.ReadKey()
End SubEnd Module
参考サイト
- http://www.mnc.co.jp/INtime/user/intimedev.php?.NET%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A4%CB%A4%AA%A4%B1%A4%EB%B6%A6%CD%AD%A5%E1%A5%E2%A5%EA%A5%A2%A5%AF%A5%BB%A5%B9%CA%FD%CB%A1
- http://msdn.microsoft.com/ja-jp/library/4ca6d5z7(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-4
VBプログラミングチップス(Marshal) [開発環境]
◆System.Runtime.InteropServices.Marshall
アンマネージ メモリの割り当て、アンマネージ メモリ ブロックのコピー、マネージ型からアンマネージ型への変換などができる。
Copyメソッド
- Marshal.Copy (Byte[], Int32, IntPtr, Int32) "1 次元の 8 ビット符号なし整数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (Char[], Int32, IntPtr, Int32) "1 次元の文字列のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (Double[], Int32, IntPtr, Int32) "1 次元の倍精度浮動小数点数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (Int16[], Int32, IntPtr, Int32) "1 次元の 16 ビット符号付き整数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (Int32[], Int32, IntPtr, Int32) "1 次元の 32 ビット符号付き整数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (Int64[], Int32, IntPtr, Int32) "1 次元の 64 ビット符号付き整数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Byte[], Int32, Int32) "アンマネージ メモリ ポインタのデータを 8 ビット符号なし整数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Char[], Int32, Int32) "アンマネージ メモリ ポインタのデータを文字列のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Double[], Int32, Int32) "アンマネージ メモリ ポインタのデータを倍精度浮動小数点数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Int16[], Int32, Int32) "アンマネージ メモリ ポインタのデータを 16 ビット符号付き整数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Int32[], Int32, Int32) "アンマネージ メモリ ポインタのデータを 32 ビット符号付き整数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, Int64[], Int32, Int32) "アンマネージ メモリ ポインタのデータを 64 ビット符号付き整数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr, IntPtr[], Int32, Int32) アンマネージ メモリ ポインタのデータをマネージ IntPtr 配列にコピーします。
- Marshal.Copy (IntPtr, Single[], Int32, Int32) "アンマネージ メモリ ポインタのデータを単精度浮動小数点数のマネージ配列にコピーします。
.NET Compact Framework によってサポートされています。" - Marshal.Copy (IntPtr[], Int32, IntPtr, Int32) 1 次元のマネージ IntPtr 配列のデータをアンマネージ メモリ ポインタにコピーします。
- Marshal.Copy (Single[], Int32, IntPtr, Int32) "1 次元の単精度浮動小数点数のマネージ配列のデータをアンマネージ メモリ ポインタにコピーします。
.NET Compact Framework によってサポートされています。"
参考サイト
プロセス間通信の特徴 [開発環境]
同期機能
◆クリティカルセクション
同時には一つのスレッドだけがリソースにアクセスするような複数スレッド間同期に用いられる。クリティカルセクションは同一のプロセス内のスレッド間でのみ利用できる。
◆ミューテックス
共有リソースにアクセスできるスレッドを同時には一つに制限するための同期オブジェクト。複数プロセスにまたがって使用できる。
◆イベント
プロセス/スレッド間で「待ち」「通知」を行うための同期オブジェクト
◆セマフォ
共有リソースに同時にアクセスできるスレッドの数を「一定数以下」という形で設定できる同期オブジェクト。
通信機能
◆共有メモリ
原始的なプロセス間通信で、普通のメモリのようにアクセスできるメモリです。 プロセスはプロセス固有のアドレス空間を持っていますが、共有メモリに確保されたメモリは 特別の空間で、プロセス間で共有されます。
プロセス間通信で最もシンプルで高速なものではないかと思います。使い道としては複数のプロセスでデータを共有したり、メッセージやフラグとして使用するのにも良いと思います。
◆メールスロット
メッセージをランダムにポストするプロセス/スレッドとそれを受け取って順次処理するプロセス/スレッドの組み合わせを構成する通信機能。
メールスロットはいわば簡易メッセージキューであり,メッセージの到着を待ち受けるプロセスと,メッセージをポスト(発信)するプロセスの間を取り持ってくれる仕組みである。送信側プログラムが送り出した「メッセージ」が次々とメールスロットにポストされ,読み出し側プログラムはそれを順に取り出して処理することができる。
メールスロットはサービスプロセスに次々と情報を投入し収集させるといった場面で利用できる。ただし,接続先を強く意識した処理,とくにアクセスコントロールについてはメールスロットへの書き込みを特定のアカウントに制限できるといったことだけであり,きめ細かな処理を行う場合には名前付きパイプの方が向いている。
◆名前付きパイプ
複数のプロセス/スレッド間で双方向の通信チャネルを開設できる通信機能
「名前付きパイプ」はシステム上の複数プロセスが双方向にデータを交換できる通信チャネルである。生成時に設定する上限の個数の範囲内で同時に複数の名前付きパイプを設けることができ,1つのサーバプログラムが複数のクライアントプログラムと通信することが可能である
名前付きパイプを使うときには,メールスロットと同じように「メッセージ」の単位で通信をするモードと,バイトストリームとして読み書きするモードの2つのモードが選べる。
参考サイト
- http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_02.html
- http://linuxgcc.sytes.net/sys013.php