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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
爺プログラマー

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

#1

投稿記事 by 爺プログラマー » 15年前

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

ISLe

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

#2

投稿記事 by ISLe » 15年前

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のバージョンについて

#3

投稿記事 by 爺プログラマー » 15年前

ISLeさん、どうも

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

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

ISLe

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

#4

投稿記事 by ISLe » 15年前

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

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

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


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

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

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

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

爺プログラマー

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

#5

投稿記事 by 爺プログラマー » 15年前

ISLeさん 丁寧な回答ありがとうございます。

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

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

ISLe

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

#6

投稿記事 by ISLe » 15年前

> 単純に考えたのですが、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のバージョンについて

#7

投稿記事 by 爺プログラマー » 15年前

詳しくありがとうございます。感謝します。

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

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


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

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

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

ISLe

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

#8

投稿記事 by ISLe » 15年前

> 例えば、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のバージョンについて

#9

投稿記事 by 爺プログラマー » 15年前

ISLe さん毎度丁寧にありがとうございます。

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る