ページ 11

ダイレクトXのバージョンについて

Posted: 2010年7月11日(日) 21:41
by 爺プログラマー
Windows7にはDX10が標準でインストールされていますが、DX9以前を使ったアプリは動かないためDX9のランタイムのみインストールする方法を教えてください。
現在より低いバージョンをインストールするとOSが拒否するのでどのようにすればいいですか?
また、ランタイムのみダウンロードできるでしょうか?

Re:ダイレクトXのバージョンについて

Posted: 2010年7月12日(月) 00:49
by ISLe
DX9だけでもたくさんバージョンがあるんですけど。

DirectX エンド ユーザー ランタイム Web インストーラ
http://www.microsoft.com/downloads/deta ... 6652cd92a3

↑のプログラムを実行すると過去すべてのバージョンのランタイムがインストールされます。

特定のSDKバージョンに対応したものなら

Microsoft ダウンロードセンター を"DirectX Redist"で検索した結果
http://www.microsoft.com/downloads/ja-j ... laylang=ja

こちらから目的のものをダウンロードしてインストールしてください。

DirectX SDKをインストールしたフォルダのRedistフォルダに↑と同じランタイムのインストールパッケージがあるので必要なランタイムだけを自作アプリのインストールパッケージに含めることもできます。


> 現在より低いバージョンをインストールするとOSが拒否するのでどのようにすればいいですか?

どういう現象か具体的に教えていただけませんか?

Re:ダイレクトXのバージョンについて

Posted: 2010年7月12日(月) 10:07
by 爺プログラマー
ISLeさん、どうも

「新しいバージョンのDXがすで存在します」などでインストールが中断させられます。だぶん

Win7ユーザーにDX9のインストールを指示したくないので、
実行ファイルと同梱で再配布する形でのランタイム(DLLファイル)はないでしょうか?
開発で使用したヘッダーファイルとインクルードファイルを実行ファイルと同じ場所に同梱しても動作しないでしょうか?
サウンド8関連のDLLを同梱配布して動作できれば一番いいのですが・・・

Re:ダイレクトXのバージョンについて

Posted: 2010年7月12日(月) 18:45
by ISLe
> 「新しいバージョンのDXがすで存在します」などでインストールが中断させられます。だぶん

それは文字通りならインストールする必要がないときに出ると思います。
あるいはセットアッププログラムが古くてバージョンチェックに失敗している可能性があります。

Windows7にDX9やDX8のランタイムをインストールできないということはありません。
ウチではXP以前のPCゲームが7(x64)で不具合無く動いてますよ。
むしろVistaでは動かなかったゲームが7では動いてます。


> Win7ユーザーにDX9のインストールを指示したくないので、
> 実行ファイルと同梱で再配布する形でのランタイム(DLLファイル)はないでしょうか?

DirectX関連のDLLはセットアッププログラムを使ってシステムに登録されないと使えません。

> 実行ファイルと同梱で再配布する形でのランタイム(DLLファイル)はないでしょうか?

DirectX SDKのRedistフォルダに入っているファイル群がそれです。
セットアップを自動化することはできますがセットアップ作業そのものを省くことはできません。

Re:ダイレクトXのバージョンについて

Posted: 2010年7月12日(月) 20:30
by 爺プログラマー
ISLeさん 丁寧な回答ありがとうございます。

単純に考えたのですが、XPのWindows→system32フォルダーのDSOUND.dllを実行ファイルに添付してWin7のsystemフォルダーにコピーしてもDX8環境で動作するとは考え難いと思いますがやはり不可能でしょうね。

やはり指示頂いた、「DirectX エンド ユーザー ランタイム Web インストーラ」の線で行きたいと考えます。

Re:ダイレクトXのバージョンについて

Posted: 2010年7月12日(月) 22:00
by ISLe
> 単純に考えたのですが、XPのWindows→system32フォルダーのDSOUND.dllを実行ファイルに添付してWin7のsystemフォルダーにコピーしてもDX8環境で動作するとは考え難いと思いますがやはり不可能でしょうね。

DirectX関連のDLLはレジストリにGUIDと関連付けられて登録されますから、もしGUIDの異なる同名ファイルを上書きするようなことがあれば最悪システムが破壊されるかもしれません。


ちょっと調べてみました。
XP(x86)、7(x64)ともにウエブインストーラで最新ランタイムに更新済みです。
XPのdsound.dllと7のdsound.dllは異なるバージョンでした。
それから7にはWindows→WinSxSファルダにサイドバイサイド構成が作成されています。
さらにx64だとWindows→system32には64ビット版、Windows→SysWOW64に32ビット版があります。
64ビット版のサイドバイサイド構成も作成されています。
下手に触らない方が良さそうです。

Re:ダイレクトXのバージョンについて

Posted: 2010年7月13日(火) 09:46
by 爺プログラマー
詳しくありがとうございます。感謝します。

私はVC++で組んだソフトウエアがDLLを参照する振る舞いは知る事が出来ませんが、参照手順は作成したプログラム本体に記述されているのでしょうか?
例えば、OSのシステム内のDLLに記述がなければ、アプリケーション本体のそばにあるDLLを参照するとか、そういった流れにはならいのでしょうかね。

これが可能であれば、アプリと同梱すれば、システムエリアのDLLを書き換える心配もないと考えるのですが、素人考えでしょうか?


また、調べて頂いた
>XP(x86)、7(x64)ともにウエブインストーラで最新ランタイムに更新済みです。

このことは、7ユーザーに、
「DirectX エンド ユーザー ランタイム Web インストーラ」
を指示する必要が無いということになり、7ユーザはDirectXを使ったアプリのDXバージョンは気にする必要は全くないと解釈して差し支えないでしょうか?

また、よろしくお願いします。

Re:ダイレクトXのバージョンについて

Posted: 2010年7月13日(火) 16:45
by ISLe
> 例えば、OSのシステム内のDLLに記述がなければ、アプリケーション本体のそばにあるDLLを参照するとか、そういった流れにはならいのでしょうかね。

ひと口にDLLと言ってもいろんな種類があります。

単純に関数やクラスをエクスポートしただけのDLLはおっしゃるようにカレントディレクトリ→システムディレクトリの順に検索されて先に見付かったものを使用するようにできます。

DirectX関連のDLLはCOMコンポーネントです。
#COMもまたActiveX等さまざまな方式の総称です。
プログラムがGUIDを指定して取得したインターフェースを使用する仕組みになっています。
これをシステムが中継する際にレジストリに登録された情報を使用します。
このようなDLLはさまざまなアプリケーションで共有されるので配置場所も管理されています。
異なるバージョンの同名ファイルDLLが共存できるサイドバイサイドという仕組みも導入されさらに配置場所が重要になっています。
#サイドバイサイドとは実行ファイルにマニフェストを追加することで特定のバージョンのDLLを使用するように指定することができる仕組みです。


> このことは、7ユーザーに、
> 「DirectX エンド ユーザー ランタイム Web インストーラ」
> を指示する必要が無いということになり、7ユーザはDirectXを使ったアプリのDXバージョンは気にする必要は全くないと解釈して差し支えないでしょうか?

いえ。ウェブインストーラを実行すると過去のすべてのバージョンのランタイムに対して古いものは更新され不足しているものは新規インストールされます。
DirectXバージョンごと(というかコンポーネントによってはSDKごと)にランタイムが異なり個々のランタイムがインストールされます。
アプリケーションが必要としているランタイムがインストールされているかどうかは常に気にする必要があります。

DirectSoundに限ればDirectSound8からバージョンが上がっていないので7のデフォルト状態でも動くかもしれません。

Re:ダイレクトXのバージョンについて

Posted: 2010年7月13日(火) 17:41
by 爺プログラマー
ISLe さん毎度丁寧にありがとうございます。

Windowsプログラムはやはり基本を理解していなけれ限界があるのですね。

インストールの行動がわかったような想いです。

今回、Win7で
DirectSoundCaptureCreate8( NULL, &pDSC, NULL );
を取得時に、
DSERR_ALLOCATED
DSERR_INVALIDPARAM
DSERR_NOAGGREGATION
DSERR_OUTOFMEMORY
以外のエラーがでたのは、DXの問題ではなくデバイスもしくは録音設定の不備だと考えます。

7ユーザーに確認をとってみます。