いろきゅうのブログ

はてなダイアリーから移行中…

「空を仰ぎて雲たかく」の体験版が起動しない…けど、執念で動かしたぁッ!

空を仰ぎて雲たかく好評予約受付中

どーーーらーーーごーーーんーーーー!!

…さて(ぉ

中の人が「体験版公開したよ!」と つぶやかれていた ので、ドラゴンとキャッキャウフフするんじゃぐふふふふふ……

と、わくわくテカテカしながら体験版をDL!インストール!起動!!







http://ir9.jp/hd10/0627_01.png

---------------------------
T_dragon.exe - アプリケーション エラー
---------------------------
アプリケーションを正しく初期化できませんでした (0xc0150002)。
[OK] をクリックしてアプリケーションを終了してください。 
---------------------------
OK   
---------------------------


oh......



長い旅の始まりでした…

環境

動かない環境(メインPC)

  • Winodws XP 64bit SP2
  • 色々開発環境が入ってる
    • VC6.0
    • VS2003Pro
    • VS2005Pro
    • VC2008EE
    • VC#2008
  • DirectX 9.0c SDK (2004 oct) 導入
    • Dx3D を Retail DLL を利用するようにしてもダメだった。
  • サービスをいくつか止めている
    • これが原因? Side-by-Side で必要なサービスってあるんかしら…?

ちなみに、おいらのサブマシンの Vista 機では問題なく動作しました。

http://ir9.jp/hd10/0627_08.png

ぐぬぬぬぬぬ……

結論からいうと

2つの問題を抱えていました……といいつつ、本当に根本的にそこが原因なのかまでは良くわかりませんけれども…(ぉ ^^;

Lua5.1.dll の マニフェストの問題

Lua5.1.dll なんちゅーファイルがあることに、何となく親近感が沸いてみたりしてますがー(ぉ

Dependency Walker にこのDLLを投げると MSVCR80.dll が無いとか言われるわ「The Side-by-Side configuration information in "LUA5.1.DLL" contains errors.」" とか言われちゃったわけですよ。

こりゃー Side by side 関連で何かあるなぁと調査。 そして DLL の中に次のようなマニフェストが含まれていることが分かりました。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="5.1.4.0"
    processorArchitecture="*"
    name="Lua"
    type="win32"
/>
<description>Lua Console</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC80.CRT"
            version="8.0.50727.762" 
            processorArchitecture="*"
            publicKeyToken="1fc8b3b9a1e18e3b"
        />
    </dependentAssembly>
</dependency>
</assembly>

おいらマニフェストは良くわからんのですけれども…(ぉ^^;) 「processorArchitecture="*"」が怪しいのかしらと目星をつけ x86 に適当に置き換えすr…… しようにも、DLLの中のリソースなので置き換えする事が出来ません。

…いやまぁ、バイナリエディタで書き換えてもいいんですけども(ぉ)、おいらは

  • Visual Studio でこのDLL開く
  • マニフェストリソースを削除
  • 上書き保存 してDLLからリソースを削除。
  • LUA5.1.DLL.manifest ファイルを同じディレクトリに作成
  • "*" を "x86" に置き換えた xml ファイルを中に書く(ってかほぼコピペ)

として、外部ファイルのマニフェストファイルを読み込むようにしました。

すると、Dependency Walker がちゃんと MSVCR80.dll を探しに行ってくれましたよかったよかった! これでキャッキャウフフできるよママン!!



…と思ったらやっぱ起動しませんでした。 キャッキャウフフさせて欲しいのかしら… orz



T_dragon.exe の マニフェストの問題

今度は実行ファイル本体です。

次のようなマニフェストが含まれています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
	version="0.0.0.1"
	processorArchitecture="X86"
	name="DebonosuFactory.game.game"
	type="win32"
/>
<description>dragon</description>
<dependency>
	<dependentAssembly>
		<assemblyIdentity
			type="win32"
			name="Microsoft.Windows.Common-Controls"
			version="6.0.0.0"
			processorArchitecture="X86"
			publicKeyToken="6595b64144ccf1df"
			language="*"
		/>
	</dependentAssembly>
</dependency>
</assembly>

これも、Lua5.1.dll と同じ時のように VS で開いてマニフェスト削除 → T_dragon.exe.manifest を作成して対応しました。 うごくようになった時のマニフェストはこんな感じ。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
	version="0.0.0.1"
	processorArchitecture="X86"
	name="DebonosuFactory.game.game"
	type="win32"
/>
<description>dragon</description>
<dependency>
	<dependentAssembly>
		<assemblyIdentity
			type="win32"
			name="Microsoft.Windows.Common-Controls"
			version="6.0.0.0"
			processorArchitecture="X86"
			publicKeyToken="6595b64144ccf1df"
			language="*"
		/>
	</dependentAssembly>
</dependency>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC80.CRT"
            version="8.0.50727.762" 
            processorArchitecture="x86" 
            publicKeyToken="1fc8b3b9a1e18e3b"
        />
    </dependentAssembly>
</dependency>
</assembly>

んまぁつまりは、MSVCR80.dll の ver. 8.0.50727.762 に依存してるよってこと追加で書いた…と。

これで晴れて

http://ir9.jp/hd10/0627_07.png

起動しましたあああああああああああああああ!!!

やったああああああああああ!!

これでキャッキャウフフできるよママーーーーン!!!(振り向くと泣いている母親)

…ってかもう 12:30 じゃねぇかああああ!!! → 21:00 頃から色々解析し始めた




…でまぁ、間違いなくおいらの環境ではこれで動いたんですが、もう少し簡単に修正する方法があるかもしれません。

ってか、manifest ファイルを DLL 外優先で読んでくれる方法が分かれば、リソースからマニフェスト削除とかやらんで済むようになるんですけどねぇ…。 あったような無かったような……うーん…


なんかもうちょっとやり方あったら誰か教えてください。(他力本願