DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Windows98SEでのSide-By-Side

環境/言語:[Windows98SE、VB]
分類:[VB6以前]

皆さん、始めまして。ヒロと申します。

WindowsXP、VB6にてFileSystemObjectを使用したアプリケーションを
開発しています。
FileSystemObjectはscrrun.dllのバージョンが5.4以上でないと使えないと
認識しているのですが、FileSystemObjectに対応していないバージョンの
scrrun.dllが入っているPCでも動作させたいと思っています。
そこで、ネット上で調べた結果、Side-By-Sideの機能を使えばいいのかなと思い、
下記のように行いました

@実行環境はWindows98SE。Windowsのシステムフォルダ内にある
 scrrun.dllのバージョンはver.5.0。
AアプリケーションフォルダにFileSystemObjectに対応している
 scrrun.dllをコピー。このscrrun.dllのバージョンはver.5.6。
Bアプリケーションフォルダ内に実行ファイルと同名のlocalファイル
 を作成。
 ※実行ファイル名が「abc.exe」であれば「abc.exe.local」という空の
  ファイルを作成。

上記の構成にてアプリケーションを実行すると、FileSystemObjectを
使用するところで、エラーとなってしまいます。
Windowsのシステム情報にてメモリに読み込まれているDLLを確認すると
scrrun.dllはアプリケーションフォルダ内にあるほうが読み込まれている
のですが、なぜかエラーとなってしまいます。

どうかご教授下さい。よろしくお願いします。
> scrrun.dllはアプリケーションフォルダ内にあるほうが読み込まれている
> のですが、なぜかエラーとなってしまいます。

少し確認させてください。

・該当 DLL を“参照設定”しているのか否か。
・DLLの参照設定を 行う / 外す 事で、結果は変化するか。
・エラーのタイミング(特定のメソッド呼び出し時にエラーになるのかどうか)。
・どのような エラーが発生しているのか。
お返事ありがとうございます。
遅くなりまして申し訳ございませんが、お問い合わせの件、
回答致します。

> ・該当 DLL を“参照設定”しているのか否か。

VBプロジェクトの参照設定にて「Microsoft Scripting Runtime」を
選択しています。

> ・DLLの参照設定を 行う / 外す 事で、結果は変化するか。

参照設定を外し、CreateObject("Scripting.FileSystemObject")を使用
しても結果は同じでした。

> ・エラーのタイミング(特定のメソッド呼び出し時にエラーになるのかどうか)。

テキストファイルの行数を調べる以下のモジュールのOpenTextFileを実行すると
エラーとなります。

Public Function GetFileLineNum(ByVal strFnm As String) As Long
Dim Fso As New FileSystemObject
Dim FsoTS As TextStream
Set FsoTS = Fso.OpenTextFile(strFnm, ForAppending) '←ここでエラー
GetFileLineNum = FsoTS.Line
FsoTS.Close
Set FsoTS = Nothing
End Function

> ・どのような エラーが発生しているのか。

「クラスはオートメーションまたは予測したインターフェースをサポート
していません。」というエラーになります。

以上、よろしくお願いします。
> FileSystemObjectはscrrun.dllのバージョンが5.4以上でないと使えないと
> 認識しているのですが、FileSystemObjectに対応していないバージョンの
> scrrun.dllが入っているPCでも動作させたいと思っています。

あれ? 使用できるようになったのって、scrrun.dll v5.4 からでしたっけか。

手元に v5.0がなく、一番低いものでも v5.1.0.4615 しか用意できなかったので
今回の検証にはならないのですが、このバージョンでは、提示された
ソースコード(の実行時結合バージョン)が、動作してくれたようです。


Private Const ForAppending As Long = 8&

Public Function GetFileLineNum(ByVal strFnm As String) As Long
'Dim FSO As Scripting.FileSystemObject
'Dim FSO As IFileSystem3
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

'Dim FsoTS As Scripting.TextStream
'Dim FsoTS As ITextStream
Dim FsoTS As Object
Set FsoTS = FSO.OpenTextFile(strFnm, ForAppending)
GetFileLineNum = FsoTS.Line
FsoTS.Close
Set FsoTS = Nothing
Set FSO = Nothing
End Function
> あれ? 使用できるようになったのって、scrrun.dll v5.4 からでしたっけか。

Side-By-Sideの機能を使わず(アプリケーションフォルダのlocalファイルを
削除し)、システムフォルダ内にあるscrrun.dll(ver.5.0)がロードされる
ようにしたら、エラーなく実行できるようになりました。
ver.5.4以降からという私の認識違いですね...すいませんでした。

でも、Side-By-Sideにてアプリケーションフォルダ内にあるscrrun.dll
(ver.5.6)がロードされているのに、エラーとなるのは何故なのか
分かりません。

XP上でセットアップを作って、Win98にインストールするとscrrun.dllが
新しいバージョンに上書きされてしまうと思うのですが、気にしなくても
いいのでしょうか?Side-By-Sideの機能を使えばこれが回避できるのかな
と思って今回チャレンジした次第です。

それとも、scrrun.dllはセットアップに含める必要はないのでしょうか?
scrrun.dllはIE5以降がインストールされていれば入っているはずだという
情報もあるのですが...
そうなると、このアプリケーションが動作する条件としてはIE5以降が
インストールされていること!となってしまいますね。

質問ばかりですいません。何かアドバイス等ありましたらお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板