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
)
2012年1月4日
#
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/
2011年12月30日
#
"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
2011年11月16日
#
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 のビルド番号がインクリメントされます。
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
)
2011年10月12日
#
バッチファイルで、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
---
バッチファイルで、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
---
バッチファイルで、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
---
バッチファイルで、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 などの
フォルダーが定義されています。上記のバッチを参考に、必要なサブルーチンを作ると便利かもしれません。
2011年7月13日
#
各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
2011年7月12日
#
以下のバッチファイルをダブルクリックすると、そのバッチファイルがあるフォルダの
配下の全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
バッチファイルで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%
2011年7月4日
#
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
2011年7月1日
#
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
2011年6月29日
#
私は、新しい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
とりあえず、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
2011年6月28日
#
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;
};
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
2011年5月13日
#
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 書き込みのアクセス許可を与えます。
---
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