DirectXを用いたActiveXを用いてVistaで情報が取れない
ActiveXからDirectXを叩いてOSやCPUなどの情報を
取得しようとしています。
XPでは問題なく情報が取れますが、Vistaでは
情報が取れる項目と取れない項目があります。
この現象について、教えてください。
APIは正常に終了しています。
OS(szOSExLongEnglish) → 正常取得
ベンダー(szSystemManufacturerEnglish) → n/a
型番(szSystemModelEnglish) → n/a
CPU(szProcessorEnglish) → (空白)
物理メモリ(szPhysicalMemoryEnglish) → 正常取得
IEのデフォルトの設定では上記のような状態ですが、
設定を変えて保護モードを外すと正常動作し、
すべての情報が取得できます。
しかし、保護モードが有効の状態で、
情報取得したいです。
以下にコードを書きます。
※このコードはあるサンプルソースをほとんどそのまま使っています。
////////////////////////////////////////////////////////////////////////////////
// 初期化
////////////////////////////////////////////////////////////////////////////////
bool CDxDiagLib::Init(void)
{
HRESULT hr;
DXDIAG_INIT_PARAMS dxDiagInitParam;
m_pDxDiagProvider = NULL;
m_pDxDiagRoot = NULL;
g_DxDiagInfo = NULL;
g_DxSoundInfo = NULL;
// COMライブラリを使用できるように初期化
hr = CoInitialize(NULL);
if (FAILED(hr))
{
return false;
}
hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider);
if( FAILED(hr) || m_pDxDiagProvider == NULL)
{
return false;
}
// DXDIAG_INIT_PARAMSを初期化
ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) );
dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS);
dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
// WHQLを確認するかどうか
// ネットを経由するので基本的にはfalseにしておく
dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks;
dxDiagInitParam.pReserved = NULL;
hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam );
if( FAILED(hr) )
{
return false;
}
hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot );
if( FAILED(hr) )
{
return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
// DxDiag でSystem情報を取得
////////////////////////////////////////////////////////////////////////////////
bool CDxDiagLib::GetSyatemInfo( void )
{
HRESULT hr;
IDxDiagContainer* pObject = NULL;
DWORD nInstanceCount = 0;
DWORD nItem = 0;
DWORD nCurCount = 0;
// "DxDiag_SystemInfo" を取得
if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) )
{
return false;
}
// 情報保存領域の確保
ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo));
if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) )
{
SAFE_RELEASE( pObject );
return false;
}
if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) )
{
SAFE_RELEASE( pObject );
return false;
}
if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) )
{
SAFE_RELEASE( pObject );
return false;
}
if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) )
{
SAFE_RELEASE( pObject );
return false;
}
if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) )
{
SAFE_RELEASE( pObject );
return false;
}
SAFE_RELEASE( pObject );
return true;
}
よろしくお願いいたします。
お礼
ご回答ありがとうございます。 directxは初めて2週間くらいで(C++も)まだまだサッパリです>< ただ、この問題は解決することができました(強制終了が出なくなっただけですけど・・・)。 参考を元に入力検出もできるように頑張ります。