社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

2012年1月6日 #

環境変数の値が数字がどうかを調べる - バッチファイル

バッチファイルでは、以下のようにset /a を使うと数値 (整数のみ)の計算ができます。
下の例では、%HOGE2% には、2 が代入されます。

set HOGE=1
rem set HOGE=aaaa
set /a FUGA=%HOGE% + 1

しかし、%HOGE% に数字以外が代入されている場合、エラーは発生せずに、
%HOGE2% には、1 が代入されます。%HOGE% は0 と見なされるようです。

この仕様は、便利なこともあるかもしれませんが、バグになることも多いかと思います。
そこで、以下のように事前に%HOGE% が数字かどうかを検証して、エラーにすると
良いでしょう。

rem set HOGE=1
set HOGE=aaaa
set /a HOGE2=%HOGE%*1
if not "%HOGE%"=="%HOGE2%" (
 echo 数字ではありません
 pause
 exit /b 1
)
 

posted @ 17:36 | Comment (0)

2012年1月4日 #

4年半ぶりに、WTL 8.1.11324 がリリース!!

4年半ぶりに、WTL 8.1.11324 がリリースされました。もう更新されることは無いのかと
思っていたので、かなり驚きました。DWM とRibbun 対応がメインのようです。

// CDwm
// CDwmImpl<T, TBase>
// CDwmWindowT<TBase> - CDwmWindow
// CDwmThumbnailT<t_bManaged, TBase>
// CDwmThumbnail
// CDwmThumbnailHandle
// CAeroControlImpl

// CRibbonUpdateUI : Automatic mapping of ribbon UI elements
//
// RibbonUI::Text
// RibbonUI::CharFormat
// RibbonUI::ICtrl
// RibbonUI::CtrlImpl
// RibbonUI::CommandCtrlImpl
// RibbonUI::ItemProperty
// RibbonUI::CollectionImplBase
// RibbonUI::CollectionImpl
// RibbonUI::TextCollectionImpl
// RibbonUI::ItemCollectionImpl
// RibbonUI::ComboCollectionImpl
// RibbonUI::CommandCollectionImpl
// RibbonUI::ToolbarCollectionImpl
// RibbonUI::SimpleCollectionImpl
// RibbonUI::CollectionCtrlImpl
// RibbonUI::ToolbarGalleryCtrlImpl
// RibbonUI::SimpleCollectionCtrlImpl
// RibbonUI::RecentItemsCtrlImpl
// RibbonUI::FontCtrlImpl
// RibbonUI::ColorCtrlImpl
// RibbonUI::SpinnerCtrlImpl
//
// RibbonUI::CRibbonImpl
//  CRibbonImpl::CRibbonComboCtrl
//  CRibbonImpl::CRibbonItemGalleryCtrl
//  CRibbonImpl::CRibbonCommandGalleryCtrl
//  CRibbonImpl::CRibbonToolbarGalleryCtrl
//  CRibbonImpl::CRibbonSimpleComboCtrl
//  CRibbonImpl::CRibbonSimpleGalleryCtrl
//  CRibbonImpl::CRibbonRecentItemsCtrl
//  CRibbonImpl::CRibbonColorCtrl
//  CRibbonImpl::CRibbonFontCtrl
//  CRibbonImpl::CRibbonSpinnerCtrl
//  CRibbonImpl::CRibbonFloatSpinnerCtrl
//  CRibbonImpl::CRibbonCommandCtrl
//
// CRibbonFrameWindowImplBase
// CRibbonFrameWindowImpl
// CRibbonMDIFrameWindowImpl
// CRibbonPersist
//
// Global functions:
//   RibbonUI::SetPropertyVal()
//   RibbonUI::GetImage()


■Windows Template Library (WTL) - SourceForge
http://sourceforge.net/projects/wtl/

posted @ 15:53 | Comment (0)

2011年12月30日 #

(ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows

"1.0.0.1"や"1.00.000.2"といった(ファイル)バージョン文字列を扱うクラスを、
アップデートしました。

 

---
#pragma once

#include <stdlib.h>
#include <vector>


////////////////////////////////////////////////////////////////////////////////
// CVersionStringT

template <int t_nCount, TCHAR t_chSep = _T('.')>
class CVersionStringT
{
protected:
	typedef CVersionStringTr<t_nCount>								thisClass;
#ifndef _CSTRING_NS
	typedef CString													stringClass;
#else
	typedef _CSTRING_NS::CString									stringClass;
#endif

public:
	CVersionStringT() : m_dwVals(t_nCount)
	{
		this->SetVersion(_T(""));
	}
	CVersionStringT(__in_z LPCTSTR newVal) : m_dwVals(t_nCount)
	{
		this->SetVersion(newVal);
	}
	~CVersionStringT()
	{
	}

public:
	operator stringClass ()
	{
		return thisClass::GetVersion();
	}
	thisClass &operator = (__in_z LPCTSTR newVal)
	{
		thisClass::SetVersion(szVersion)
		return *this;
	}
	bool operator == (__in const thisClass& versionString)
	{
		return (thisClass::Compare(*this, versionString) == 0);
	}
	bool operator < (__in const thisClass& versionString)
	{
		return (thisClass::Compare(*this, versionString) < 0);
	}
	bool operator > (__in const thisClass& versionString)
	{
		return (thisClass::Compare(*this, versionString) > 0);
	}
	bool operator <= (__in const thisClass& versionString)
	{
		return (thisClass::Compare(*this, versionString) <= 0);
	}
	bool operator >= (__in const thisClass& versionString)
	{
		return (thisClass::Compare(*this, versionString) >= 0);
	}

public:
	stringClass GetVersion()
	{
		return thisClass::Convert(m_dwVals);
	}
	void SetVersion(__in_z LPCTSTR newVal)
	{
		thisClass::Parse(newVal, m_dwVals);
	}
	int Compare(__in const thisClass& versionString)
	{
		return thisClass::Compare(*this, versionString);
	}

public:
	static stringClass Convert(__in const std::vectorr<DWORD>& dwVals)
	{
		stringClass strVersion;

		for (int i = 0; i < t_nCount; i++)
		{
			TCHAR szVal[16] = { 0 };
#pragma warning(push)
#pragma warning(disable:4996)
			_itot(dwVals[i], szVal, 10);
#pragma warning(pop)

			if (i == 0)
			{
				strVersion = szVal;
			}
			else
			{
				strVersion += CString(t_chSep) + szVal;
			}
		}

		return strVersion;
	}
	static void Parse(__in_z LPCTSTR szVersion, __out std::vectorr<DWORD>& dwVals)
	{
		ATLASSERT(szVersion);

		stringClass strVersion = szVersion;

		for (int i = 0; i < t_nCount; i++)
		{
			int nLength = strVersion.Find(t_chSep, 0);
			if (nLength == -1)
			{
				stringClass strVal = strVersion.Left(strVersion.GetLength());
				nLength = strVersion.GetLength();

				strVal.Trim();
				dwVals[i] = (strVal.GetLength() == 0) ? 0 : _tstoi(strVal);
			}
			else
			{
				stringClass strVal = strVersion.Left(nLength);

				strVal.Trim();
				dwVals[i] = (strVal.GetLength() == 0) ? 0 : _tstoi(strVal);
			}

			strVersion = strVersion.Right(strVersion.GetLength() - nLength - 1);
		}
	}
	static int Compare(__in_z LPCTSTR szVersion1, __in_z LPCTSTR szVersion2)
	{
		ATLASSERT(szVersion1);
		ATLASSERT(szVersion2);

		thisClass versionString1 = szVersion1;
		thisClass versionString2 = szVersion2;

		return thisClass::Compare(versionString1, versionString2);
	}
	static int Compare(__in const thisClass& versionString1, __in const thisClass& versionString2)
	{
		for (int i = 0; i < t_nCount; i++)
		{
			if      (versionString1.m_dwVals[i] r< versionString2.m_dwVals[i])
			{
				return -1;   
			}
			else if (versionString1.m_dwVals[i] > versionString2.m_dwVals[i])
			{
				return 1;
			}
		}

		return 0;
	}

public:
	std::vector<DWORD> m_dwVals;
};

typedef CVersionStringT<3>  CMsiVersionString;
typedef CVersionStringT<4>  CFileVersionString;
---


■(ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows - 社本@元ネオニート Blog
http://www.ailight.jp/Blog/sha256/archive/2007/4/13/(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%89%B1%E3%81%86%E3%82%AF%E3%83%A9%E3%82%B9%20(CVersionStringT)%20-%20Windows

 

posted @ 16:02 | Comment (0)

2011年11月16日 #

ビルド番号のインクリメント - Visual C++

C/C++ で、ネイティブ なモジュールを開発していて面倒なのが、ビルドナンバーのインクリメントです。
モジュールが少ないうちは手で更新することもできますが、多くなってくると手で更新することは現実的では
ありません。やり方は色々あるでしょうが、バッチファイルのみで簡単にできる方法を紹介します。


1. ビルド番号を定義するヘッダーファイルを作成

ここでは、ファイル名をBuildNo.h、ビルド番号をBUILDNO としています。

---
#pragma once

#define BUILDNO  1
#define BUILDNO_STR "1"
---


2.  ビルド番号をインクリメントするバッチファイルを作成

1 で用意したBuildNo.h をパースして、ビルド番号を取得&インクリメントした後、BuildNo.h を
作成します。上書きしてしまうことが不安な人は、オリジナルをリネームしてバックアップしておくと
良いかも しれません。ここは、ファイル名をIncrementBuildNo.cmd とします。

---
@echo off

set HEADERFILE=%~dp0BuildNo.h

for /F "usebackq tokens=1,2,3" %%i in ("%HEADERFILE%") do (
 if "%%i"=="#define" (
  if "%%j"=="BUILDNO" (
   set BuildNo=%%k
  )
 )
)
if "%BuildNo%"=="" (
 echo エラー: ビルド番号が取得できませんでした
 exit /b 1
)

rem ビルド番号のインクリメント
set /a NewBuildNo=%BuildNo%+1

rem 新しい BuildNo.h の生成
echo #pragma once >> "%HEADERFILE%"
echo. >> "%HEADERFILE%"
echo #define BUILDNO %NewBuildNo% >> "%HEADERFILE%"
echo #define BUILDNO_STR "%NewBuildNo%" >> "%HEADERFILE%"
---


3. RC ファイルを修正

ビルド番号を使うように、RCファイルを修正します。以下は、修正が必要な部分を抜粋しています。

---
FILEVERSION   1.0.0.BUILDNO
PRODUCTVERSION   1.0.0.BUILDNO

VALUE "FileVersion",     "1.0.0." BUILDNO_STR
VALUE "ProductVersion",  "1.0.0." BUILDNO_STR
---


4. ビルド前にバッチファイルを呼び出す

makefile やMSBUILD などのビルド前の処理に、2 で用意したバッチファイルを呼び出すようにすれば、
ビルドする度にBuildNo.h のビルド番号がインクリメントされます。
 

posted @ 18:25 | Comment (0)

2011年10月29日 #

管理者権限があるかどうかを調べる - バッチファイル

バッチファイルで管理者権限があるかどうかを調べる方法です。

copy nul "%SystemRoot%\temp.tmp" 1>nul 2>&1
if errorlevel 1 (
 echo.
 echo Please run as administrator
 echo.
 pause
 goto :EOF
) else (
 del "%SystemRoot%\temp.tmp" 1>nul 2>&1
)
 

posted @ 10:25 | Comment (0)

2011年10月12日 #

WiX のインストール ディレクトリ の取得 - バッチファイル

バッチファイルで、WiX のインストール ディレクトリ を取得する方法です。

---
call :GetWiX30Dir
echo WIX30DIR:      %WIX30DIR%

goto :EOF


rem ===================================================
rem GetWiX30Dir
rem ===================================================
:GetWiX30Dir
if /i "%PROCESSOR_ARCHITECTURE%"=="x86" (
 for /f "tokens=1,2,*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows Installer XML\3.0" /v "InstallRoot"') do (
  if /i "%%i"=="InstallRoot" (
   set WIX30BINDIR=%%k
  )
 )
) else if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
 for /f "tokens=1,2,*" %%i in ('reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Installer XML\3.0" /v "InstallRoot"') do (
  if /i "%%i"=="InstallRoot" (
   set WIX30BINDIR=%%k
  )
 )
) else (
 exit /b 1
)
set WIX30DIR=%WIX30BINDIR:~0,-4%
set WIX30BINDIR=
if "%WIX30DIR%"=="" (
 exit /b 1
)
exit /b 0
---

posted @ 16:41 | Comment (2)

Windows AIK のインストール ディレクトリ の取得 - バッチファイル

バッチファイルで、Windows AIK のインストール ディレクトリ を取得する方法です。

---
call :GetWindowsAik20Dir
echo AIK20DIR:      %AIK20DIR%

goto :EOF



rem ===================================================
rem GetWindowsAik20Dir
rem ===================================================
:GetWindowsAik20Dir
for /f "tokens=1,2,*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\ComponentStudio\6.1.7600.16385" /v "ServicingPath"') do (
 if /i "%%i"=="ServicingPath" (
  set AIK20ServicingDir=%%k
 )
)
set AIK20DIR=%AIK20ServicingDir:~0,-17%
set AIK20ServicingDir=
if "%AIK20DIR%"=="" (
 exit /b 1
)
exit /b 0
---

posted @ 16:38 | Comment (0)

Windows SDK のインストール ディレクトリ の取得 - バッチファイル

バッチファイルで、Windows SDK のインストール ディレクトリ を取得する方法です。

---
call :GetCurrentWindowsSdkDir
echo CurrentWindowsSdkDir: %CurrentWindowsSdkDir%

call :GetWindowsSdk71Dir
echo WindowsSdk71Dir: %WindowsSdk71Dir%

goto :EOF



rem ===================================================
rem GetCurrentWindowsSdkDir
rem ===================================================
:GetCurrentWindowsSdkDir
for /f "tokens=1,2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') do (
 if /i "%%i"=="CurrentInstallFolder" (
  set "CurrentWindowsSdkDir=%%k"
 )
)
if "%CurrentWindowsSdkDir%"=="" (
 exit /b 1
)
exit /b 0


rem ===================================================
rem GetWindowsSdk71Dir
rem ===================================================
:GetWindowsSdk71Dir
for /f "tokens=1,2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1" /v "InstallationFolder"') do (
 if /i "%%i"=="InstallationFolder" (
  set "WindowsSdk71Dir=%%k"
 )
)
if "%WindowsSdk71Dir%"=="" (
 exit /b 1
)
exit /b 0
---

 

posted @ 16:35 | Comment (0)

My Document の取得 - バッチファイル

バッチファイルで、My Document を取得する方法です。

---
call :GetMyDocumentsDir
echo MyDocumentDir: %MyDocumentDir%

goto :EOF

rem ===================================================
rem GetMyDocumentsDir
rem ===================================================
:GetMyDocumentsDir
for /f "tokens=1,2,*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal"') do (
 if /i "%%i"=="Personal" (
  set MyDocumentDir=%%k
 )
)
if "%MyDocumentDir%"=="" (
 exit /b 1
)
exit /b 0
---

"User Shell Folders" キーの下には、My Document だけではなく、Desktop, My Pictures などの
フォルダーが定義されています。上記のバッチを参考に、必要なサブルーチンを作ると便利かもしれません。

posted @ 16:23 | Comment (0)

2011年7月13日 #

Windows AIK のバージョン

各Windows AIK のバージョンに対するWindows PE、ベースとなるWindows が
混乱を招くようなので簡単にまとめてみました。


Windows AIK    Windows PE    ベースとなるWindows   
1.0 2.0 Windows Vista
1.1 2.1 Windows Vista SP1
2.0 3.0 Windows 7
2.1 3.1 Windows 7 SP1


■Windows 自動インストール キット (AIK)
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=C7D4BC6D-15F3-4284-9123-679830D629F2

■Windows Vista SP1 および Windows Server 2008 用の自動インストール キット (AIK)
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=94BB6E34-D890-4932-81A5-5B50C657DE08

■Windows 7 用の Windows 自動インストール キット (AIK)
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=696DD665-9F76-4177-A811-39C26D3B3B34

■Windows 7 SP1 用の Windows 自動インストール キット (AIK)
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=0AEE2B4B-494B-4ADC-B174-33BC62F02C5D

posted @ 20:52 | Comment (0)

2011年7月12日 #

MSIファイルを簡単にDark で逆コンパイルするバッチファイル - WiX

以下のバッチファイルをダブルクリックすると、そのバッチファイルがあるフォルダの
配下の全MSIファイルを、Dark で逆コンパイルします。

MSIファイルの作りが気になるときに、簡単にチェックできるので便利です。


---
@echo on

set WiXDir=%ProgramFiles(x86)%\Windows Installer XML v3
set SRC=%~dp0

for /r "%SRC%" %%i in ("*.msi") do (
 "%WiXDir%\bin\dark.exe" "%%i" "%%i.wxs"
)

:end
pause
---

dark.exe (逆コンパイラ) の使い方 - WiX - 社本@元ネオニート Blog
http://www.ailight.jp/Blog/sha256/archive/2005/2/3/darkexe%20(%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)%20%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%20-%20WiX

posted @ 18:09 | Comment (0)

Windows のバージョンとビルド番号の取得 - バッチファイル

バッチファイルでWindows のバージョンとビルド番号の取得する方法です。


for /f "delims=" %%i in ('ver') do set _VER=%%i
set WIN_VER=%_VER:~-9,3%
set WIN_BUILD=%_VER:~-5,4%

echo Version: %WIN_VER%
echo Build: %WIN_BUILD%
 

posted @ 16:41 | Comment (0)

2011年7月4日 #

TFS2010用の VS2008SP1 上位互換性更新プログラム その2

Visual Studio 2008 から、Team Foundation Server 2010 への接続するための
手順が面倒なので、まとめてみました。


1. Visual Studio 2008 をインストール

普通に、DVD からVisual Studio 本体とMSDN ライブラリをインストールする。

2. Team Explorer をインストール

Team Edition の場合、DVD の TFC フォルダーからインストールすることができます。
それ以外のエディションの場合、別途、ダウンロードする必要があります。

3. Visual Studio 2008 SP1 を適用

VS2008にSP1が適用済みの場合でも、後からTeam Explorerをインストールした場合、
Visual Studio 2008 SP1 を適用する必要があります。

4. Windows Update を適用

おそらく、いくつかのアップデートが見つかるでしょう。 :-)

5. TFS への接続

Team Foundation Server name のところに、http://ServerName:8080/tfs/CollectionName の形式で
入力することができるようになります。CodePlex に接続する場合、https://tfs.codeplex.com:443/tfs/TFS31 と
TFS名のところに入力することにより、接続できました。(CollectionName はプロジェクトによって変わるかも)


 ■Visual Studio Team System 2008 チーム エクスプローラ - Microsoft
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=0ED12659-3D41-4420-BBB0-A46E51BFCA86

■Microsoft Visual Studio 2008 Service Pack 1 (インストーラ)  - Microsoft
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=FBEE1648-7106-44A7-9649-6D9F6D58056E

■Team Foundation Server 2010 (インストーラー) 用の Visual Studio Team System 2008 Service Pack 1 上位互換性更新プログラム
http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d&displaylang=ja-nec
 

posted @ 17:11 | Comment (0)

2011年7月1日 #

Kinect for Windows SDK Beta Forums

Kinect for Windows SDK Beta Forums というのができたようですね。

- General Discussion—Kinect for Windows SDK Beta from Microsoft Research
- NUI API and Programming—Kinect for Windows SDK Beta from Microsoft Research
- Audio API and Programming—Kinect for Windows SDK Beta from Microsoft Research


■Kinect for Windows SDK Beta Forums - MSDN
http://social.msdn.microsoft.com/Forums/en/category/kinectsdk

posted @ 21:11 | Comment (0)

2011年6月29日 #

TFS2010用の VS2008SP1 上位互換性更新プログラム その1

私は、新しいVisual Studio (VS2010)は、古いバージョンのTeam Foundation Server (TFS2008, TFS2005) に
接続できるが、古いVisual Studio (VS2005, VS2008)は、新しいバージョンのTeam Foundation Server (TFS2010) には
接続できないと、今まで思っていました。

しかし、TFS2010用 VS2008SP1 上位互換性更新プログラム"をインストールすることにより、古いVisual Studio
(VS2005, VS2008)から新しいバージョンのTeam Foundation Server (TFS2010) に接続できるようになるようです。


それにしても、正式名称が長すぎです。。


■Team Foundation Server 2010 (インストーラー) 用の Visual Studio Team System 2008 Service Pack 1 上位互換性更新プログラム
http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d&displaylang=ja-nec

■TeamFoundation Server 2010 (インストーラー) 用の Visual Studio Team System 2005 Service Pack 1 上位互換性更新プログラム
http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=22215e4c-af6f-4e2f-96df-20e94d762689&displaylang=ja-nec

posted @ 21:47 | Comment (0)

Kinect SDK その3

とりあえず、Kinect の首を上下に振ることにしてみました。センサー部分が平行の時、
角度は0度です。最も上を向けた時が27度 (= NUI_CAMERA_ELEVATION_MAXIMUM) となり、
最も下を向けた時が-27度 (= NUI_CAMERA_ELEVATION_MINIMUM) となります。


	INuiInstance* pMuiInstance = pMuiInstances[0];
	ATLASSERT(pMuiInstance);

	for (LONG lAngleDegrees = NUI_CAMERA_ELEVATION_MINIMUM; lAngleDegrees < NUI_CAMERA_ELEVATION_MAXIMUM; lAngleDegrees += 3)
	{
		hr = pMuiInstance->NuiCameraElevationSetAngle(lAngleDegrees);
		if (FAILED(hr))
		{
			return hr;
		}

		::Sleep(1000);
	}


なお、この首を頻繁に振ることはハード的に考慮されていないため、あまりにも
頻繁に呼び出すとエラーが発生します。ハードを保護するためらしいです。


Kinect SDK その2
http://www.ailight.jp/Blog/sha256/archive/2011/6/28/Kinect%20SDK%20%E3%81%9D%E3%81%AE%EF%BC%92
 

posted @ 13:43 | Comment (0)

2011年6月28日 #

Kinect SDK その2

Kinect SDK Beta版では、1つのKinect を前提にしたフラットな関数 API と、
INuiInstance インターフェース を中心にした複数のKinect に対応している
API の2つが提供されています。(.NET Framework版は知りません)


とりあえず、接続されているKinectの台数を取得、インスタンスの生成と初期化、
終了処理だけのプログラムを、INuiInstance インターフェースを使って、書いて
みました。
 

	#include <vector>

	#include "./Kinect/inc/MSR_NuiApi.h"
	#include "./Kinect/inc/MSR_NuiImageCamera.h"
	#include "./Kinect/inc/MSR_NuiProps.h"
	#include "./Kinect/inc/MSR_NuiSkeleton.h"
	#include "./Kinect/inc/MSRKinectAudio.h"
	#include "./Kinect/inc/NuiImageBuffer.h"


	HRESULT hr = S_OK;

	// 接続されているKinectの台数を取得
	int nCount = 0;
	hr = ::MSR_NUIGetDeviceCount(&nCount);
	if (FAILED(hr))
	{
		return hr;
	}

	// インスタンスの生成と初期化
	std::vector<INuiInstance*> pMuiInstances;
	for (int i = 0; i < nCount; i++)
	{
		INuiInstance* pMuiInstance = NULL;
		hr = ::MSR_NuiCreateInstanceByIndex(i, &pMuiInstance);
		if (FAILED(hr))
		{
			continue;
		}
	
		hr = pMuiInstance->NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);
		if (FAILED(hr))
		{
			continue;
		}

		pMuiInstances.push_back(pMuiInstance);
	}


	// 終了処理
	for (size_t i = 0; i < pMuiInstances.size(); i++)
	{
		INuiInstance* pMuiInstance = pMuiInstances[i];
		ATLASSERT(pMuiInstance);

		pMuiInstance->NuiShutdown();
		::MSR_NuiDestroyInstance(pMuiInstance);
	}



ちなみに、INuiInstance インターフェースは、COMインターフェースではありません。。。

 

	interface INuiInstance
	{
	    virtual int InstanceIndex( ) = 0; // which instance # was it created with, in MSR_NuiCreateInstanceByIndex( )/etc?
	    virtual HRESULT     NuiInitialize( _In_ DWORD dwFlags ) = 0;
	    virtual VOID        NuiShutdown( ) = 0;
	    virtual HRESULT     NuiImageStreamOpen(
	        _In_ NUI_IMAGE_TYPE eImageType,
	        _In_ NUI_IMAGE_RESOLUTION eResolution,
	        _In_ DWORD dwImageFrameFlags_NotUsed,
	        _In_ DWORD dwFrameLimit,
	        _In_opt_ HANDLE hNextFrameEvent,
	        _Out_ HANDLE *phStreamHandle
	        ) = 0;

	    virtual HRESULT NuiImageStreamGetNextFrame(
	        _In_  HANDLE hStream,
	        _In_  DWORD dwMillisecondsToWait,
	        _Deref_out_ CONST NUI_IMAGE_FRAME **ppcImageFrame
	        ) = 0;
	
	    virtual HRESULT NuiImageStreamReleaseFrame(
	        _In_ HANDLE hStream,
	        CONST NUI_IMAGE_FRAME *pImageFrame
	        ) = 0;
	
	    virtual HRESULT NuiImageGetColorPixelCoordinatesFromDepthPixel(
	        _In_ NUI_IMAGE_RESOLUTION eColorResolution,
	        _In_opt_ CONST NUI_IMAGE_VIEW_AREA *pcViewArea,
	        _In_ LONG   lDepthX,
	        _In_ LONG   lDepthY,
	        _In_ USHORT usDepthValue,
	        _Out_ LONG *plColorX,
	        _Out_ LONG *plColorY
	        ) = 0;    
	
	    virtual HRESULT NuiCameraElevationSetAngle(
	        _In_ LONG lAngleDegrees
	        ) = 0;
	
	    virtual HRESULT NuiCameraElevationGetAngle(
	        _In_ LONG * plAngleDegrees
	        ) = 0;
	
	    virtual HRESULT NuiSkeletonTrackingEnable(
	        _In_opt_ HANDLE hNextFrameEvent,
	        _In_     DWORD  dwFlags
	        ) = 0;
	
	    virtual HRESULT NuiSkeletonTrackingDisable(
	        ) = 0;
	
	    virtual HRESULT NuiSkeletonGetNextFrame(
	        _In_  DWORD dwMillisecondsToWait,
	        _Out_ NUI_SKELETON_FRAME *pSkeletonFrame
	        ) = 0;
	
	    virtual HRESULT NuiTransformSmooth( 
	        NUI_SKELETON_FRAME *pSkeletonFrame, 
	        const NUI_TRANSFORM_SMOOTH_PARAMETERS *pSmoothingParams 
	        ) = 0;
	
	    virtual bool MSR_NuiGetPropsBlob( MsrNui::NUI_PROPSINDEX Index, void * pBlob, DWORD * pdwInOutSize ) = 0;
	    virtual MsrNui::NUI_PROPSTYPE MSR_NuiGetPropsType( MsrNui::NUI_PROPSINDEX Index ) = 0;
	};

posted @ 20:32 | Comment (0)

Kinect SDK その1

06/16 のことですが、Kinect SDK Beta が公開されました。これで、Windows 上で
遊ぶことができるようになります。ちなみに非商用用とのこと。

Kinctを持っていない人は、これを機にXbox 360 Kinect パックを買おうと思うかも
しれません。私もそう思いました。しかし、どうやら、Xbox 360 Kinect パックには
PCに接続するために必要な電源/USB ケーブルが含まれていないようなので、注意が
必要です。Kinectを単品で購入するか、Xboxカスタマーサポートにお問い合わせして
購入する必要があるようです。


■Kinect SDK
http://research.microsoft.com/kinectsdk

■Kinect 電源 / USB ケーブルの入手方法
http://blogs.msdn.com/b/hiroyuk/archive/2011/06/28/10180566.aspx

posted @ 20:07 | Comment (0)

2011年5月13日 #

ICACLS の使い方

NTFSのアクセス権を変更する/inheritance を調べていたところ、
ICACLS ツールの情報があまり載っていないようなので、一般的に
使いそうなパターンをメモとして記しておきます。



アクセス権の継承を有効にする
icacls ディレクトリー /inheritance:e

アクセス権の継承を無効にし、アクセス権を削除する
icacls ディレクトリー /inheritance:e

フルコントロールのアクセス権を配下のファイルとディレクトリーに継承する
icacls ディレクトリー /grant:r ユーザー:(OI)(CI)(F)


---
ICACLS <名前> /save <ACL ファイル> [/T] [/C] [/L] [/Q]
    名前が一致するすべてのファイルとフォルダーの DACL を <ACL ファイル> に
    格納して、後で /restore で指定できるようにします。SACL、所有者、整合性
    ラベルは保存されません。

ICACLS <ディレクトリ> [/substitute <旧 SID> <新 SID> [...]]  /restore:<ACL ファ
    イル> [/C] [/L] [/Q]
    格納されている DACL を <ディレクトリ> 内のファイルに適用します。

ICACLS <名前> /setowner <ユーザー> [/T] [/C] [/L] [/Q]
    すべての一致する名前の所有者を変更します。このオプションは所有権の変更を
    強制しません。所有権の変更を行うには、takeown.exe ユーティリティを使用し
    ます。

ICACLS <名前> /findsid <SID> [/T] [/C] [/L] [/Q]
    <SID> が明示されている ACL を含むすべての一致する名前を検索します。

ICACLS <名前> /verify [/T] [/C] [/L] [/Q]
    ACL が正規の形式ではないか長さが ACE 数と一致しないすべてのファイルを
    検索します。

ICACLS <名前> /reset [/T] [/C] [/L] [/Q]
    すべての一致するファイルについて、ACL を継承された既定の ACL と置換します。

ICACLS <名前> [/grant[:r] <SID>:perm[...]]
       [/deny <SID>:perm [...]]
       [/remove[:g|:d]] <SID>[...]] [/T] [/C] [/L]  [/Q]
       [/setintegritylevel Level:policy[...]]

    /grant[:r] <SID>:perm は、指定されたユーザー アクセス権を付与します。
        :r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
        アクセス許可に置き換えられます。
        :r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
        アクセス許可に追加されます。

    /deny <SID>:perm は、指定されたユーザー アクセス権を明示的に否定します。
        指定されたアクセス許可の明示的な否定 ACE が追加され、明示的な許可内容
        に含まれた同じアクセス許可は削除されます。

    /remove[:[g|d]] <SID> は、ACL 内にあるすべての <SID> を削除します。
        :g を指定すると、その SID に対して許可されたすべての権限を ACL から
        削除します。
        :d を指定すると、その SID に対して否定されたすべての権限を ACL から
        削除します。

    /setintegritylevel [(CI)(OI)] レベルは、すべての一致するファイルに整合性
        ACE を追加します。このレベルは次の 1 つとして指定されます。
            L[ow]
            M[edium]
            H[igh]
        整合性 ACE の継承オプションは、レベルの前に配置でき、
        ディレクトリに対してのみ適用されます。

    /inheritance:e|d|r
        e - 継承を有効にします。
        d - 継承を無効にし、ACE をコピーします。
        r - 継承された ACE をすべて削除します。


注意:
    <SID> は数値形式またはフレンドリ名形式で指定できます。数値形式の場合は、
    SID の始めに * を付けます。

    /T は、<名前> で指定されたディレクトリ以下のすべての一致するファイルと
        ディレクトリに対してこの処理が実行されることを指定します。

    /C は、どのようなファイル エラーが発生してもこの処理が続行されることを
        指定します。ただしエラー メッセージは表示されます。

    /L は、この処理がターゲットではなくシンボリック リンク自体に対して実行
        されることを指定します。

    /Q は、icacls が成功のメッセージを抑制することを指定します。

    ICACLS は、ACE エントリの正規の順序を維持します:
            明示的な否定内容
            明示的な許可内容
            継承された否定内容
            継承された許可内容

    perm はアクセス許可マスクであり、次の 2 種類の方法で指定できます:
        単純な権限を列挙:
                N - アクセス権なし
                F - フル アクセス権
                M - 変更アクセス権
                RX - 読み取りと実行のアクセス権
                R - 読み取り専用アクセス権
                W - 書き込み専用アクセス権
                D - 削除アクセス権
        特定の権限をコンマ区切りでかっこ内に列挙:
                DE - 削除
                RC - 読み取り制御
                WDAC - DAC の書き込み
                WO - 所有者の書き込み
                S - 同期
                AS - システム セキュリティへのアクセス
                MA - 無制限
                GR - 一般的な読み取り
                GW - 一般的な書き込み
                GE - 一般的な実行
                GA - 一般的なすべての操作
                RD - データ読み取り/ディレクトリの一覧表示
                WD - データ書き込み/ファイルの追加
                AD - データの追加/サブディレクトリの追加
                REA - 拡張属性の読み取り
                WEA - 拡張属性の書き込み
                X - 実行/スキャン
                DC - 子の削除
                RA - 属性の読み取り
                WA - 属性の書き込み
        継承権限はどちらの形式の前にも配置でき、ディレクトリにのみ適用され
        ます:
                (OI) - オブジェクト継承
                (CI) - コンテナー継承
                (IO) - 継承のみ
                (NP) - 継承を適用しない
                (I) - 親コンテナーから継承した権限

例:

        icacls c:\windows\* /save <ACL ファイル> /T
          - c:\windows より下にあるすべてのファイルとサブディレクトリの ACL を
          <ACL ファイル> に保存します。

        icacls c:\windows\ /restore <ACL ファイル>
        - <ACL ファイル> 内のファイルのうち c:\windows とそのサブディレクトリ
          内に存在するすべてのファイルの ACL を復元します。

        icacls <ファイル> /grant Administrator:(D,WDAC)
        - Administrator ユーザーに、<ファイル> に対する削除および DAC 書き込み
          のアクセス許可を与えます。

        icacls <ファイル> /grant *S-1-1-0:(D,WDAC)
        - SID S-1-1-0 によって定義されたユーザーに、<ファイル> に対する削除
          および DAC 書き込みのアクセス許可を与えます。
---

posted @ 18:13 | Comment (1)

Windows Server 2003 SP2 の ICACLS は、/inheritance をサポートしない (KB943043)

ICACLS はNTFS のACL を変更することができるコマンドラインツールです。
NTFSのアクセス権の変更を"あの複雑な"GUIで行うのは大変なので、大変、
有用なツールだと思います。

/inheritance を使うとアクセス権の継承を変更できるのですが、なんと
Windows Server 2003 SP2 付属のicacls はサポートしていませんでした。

かなり困っていたところ、KB943043を発見。ここから修正プログラムが
ダウンロードでき、問題が無事解決しました。

なお、非サポートですが、Xcacls.vbs というツールでもアクセス権の継承を
変更できるようです。


■Windows Server 2003 Service Pack 2 に含まれている、Icacls.exe ユーティリティは、継承ビットをサポートしません - Microsoft
http://support.microsoft.com/kb/943043/ja

■The Icacls.exe utility is available for Windows Server 2003 with Service Pack 2
http://support.microsoft.com/kb/919240

posted @ 17:54 | Comment (0)