こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Shell.ApplicationのNameSpaceを書き換えたい

こんばんは、みなさん。

少し前に以下の質問でプログラムを作っていただいたのですが、
WindowsXPだとうまく動くのに、Windows2000だとうまく動作しません。

http://question.woman.excite.co.jp/kotaeru.php3?qid=2006207

具体的には、「ZIP作成メイン」【CreateZIP(p_strZipName, p_colParams)】関数の以下の部分で、
オブジェクト実行エラーで引数の指定が間違っているとか何かのエラーが表示されました。

'書庫オブジェクトを取得する
Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))

XPではうまく動いているので、おそらくはVBScriptのインタプリタ側に
何らかの違いがあるようです。
この構文の代わりに有効なコードを書きたいと思います。

よろしくお願いします。

投稿日時 - 2006-03-23 00:18:25

QNo.2045825

すぐに回答ほしいです

質問者が選んだベストアンサー

どうも10500YEN(←よく見てね)です。

>ZIPに関連しない部分だけ抜き出したサンプルでも
>Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))
いいえ、ここがそのOSでZIPを扱えるかどうかの、一番の要です。


WIN2000環境で
(1)ZIPFLDR.DLLをレジストリ登録しましたか?
(2)それによって、エクスプローラで書庫ファイルの一覧が表示できるようになりましたか?

それができなければ、ネームスペースとしてのオブジェクトを取得は無理です。
2000環境を潰したので、私のところでの実験はできません。
以前、#5にて発言した内容について、onoohnoさんがどのような対応をしたのでしょうか?

それがわかると、無理かどうかもはっきり発言できるのですが、
今の段階では、まずは#5の発言で示した内容を行動してみてくださいとしか
言えません。。。

投稿日時 - 2006-04-03 14:54:06

補足

105YENさん、こんばんは。
>Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))
はどう解釈すればよいのでしょうか?
単に新しいシェルオブジェクトを作ってるだけに見えてます。

たしかにXP環境でZIPFLDR.DLLをリネームしてみたら、
書庫が作成できなかったのは確認しました。
明日2000環境でどうなるか確認してみます。
zipfldr.dllを%windir%\system32\に入れて、
次のコマンドを実行すればよいのでしょうか?

regsvr32 %windir%\system32\zipfldr.dll

やり方を確認できたら試してみます。
よろしくお願いします。

投稿日時 - 2006-04-04 00:36:01

ANo.6

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

レスが遅くなってすいません。

そうですかー。
何とかしてあげたいですが、各DLLについてはこちらで渡すことができる代物ではないので、どうしようもないですねー

残念ですが、お役に立てないようです。
すいません。。。。

投稿日時 - 2006-04-14 20:44:38

お礼

ここまでいろいろ知識が増えたのでそれはそれで良かったです。
もし9x系OSを触る機会があったら試してみます。
それではこの質問は締め切ります。
いろいろありがとうございました。

投稿日時 - 2006-04-14 23:46:31

ANo.8

やりかたはあっていると思います。
その結果、エクスプローラでZIPの内容を確認できましたか?
それをこちらも知りたいです。

それと
>ZIPFLDR.DLL
以外に
DZIP32.DLL
DUNZIP32.DLL
が必要なようです。
http://homepage2.nifty.com/winfaq/w2k/hints.html#1071
http://linuxmemo.dip.jp/theme.htm

これでエクスプローラで表示ができなければ、Win2000環境化では無理として、アーカイバを利用するしか思いつきません。

投稿日時 - 2006-04-09 14:35:33

補足

エクスプローラーでZIPの内容を確認するのはまだやってませんでした。
明日やってみます。また、DZIP32.DLLとDUNZIP32.DLLも同じように
例のコマンドでやるということでよいでしょうか?
手順の確認をしてると週一ペースになってしまうので、コマンドは同様でやります。
環境依存は美しくないので、それでできなかったらZIPは諦めます。

投稿日時 - 2006-04-10 21:31:33

お礼

まず、DZIP32.DLLとDUNZIP32.DLLが入手できませんでした。
DZIP32.DLLをダウンロードしようと思ってWEB検索したところ、
1050YENさんの言っている方法と同じことをやっている個人サイトがありました。
DLLはMeや98Plusに入ってるようですが、あいにくこれらのOSがありません。
XPにはないようです。どうすればよいでしょうか?
DLLが入手できなければ今回は諦めようと思います。

投稿日時 - 2006-04-12 23:16:12

ANo.7

>>Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))
>はどう解釈すればよいのでしょうか?
>単に新しいシェルオブジェクトを作ってるだけに見えてます。


「単に新しいシェルオブジェクトを作ってる」部分は
⇒Set m_objShell = CreateObject("Shell.Application")
です。


そのシェルオブジェクト.NameSpace(パス文字列)は、、、、
エクスプローラを表示すると、
・左側にTreeView[フォルダ一覧]
・右側にListView[ファイル一覧]
がありますよね?
そのフォルダ一覧側で選択したような状態を示します。


なので、エクスプローラがZIPに対応していないような状態のままで、
シェルオブジェクト.NameSpace[ZIPファイル]は無理なのです。


前にも言いましたように、私には環境が無いので正確な情報が言えませんが、、、、
Win2000にはzipfldr.dllが入っているのでしょうか?
であれば、regsvr32にzipfldr.dllをドラッグしてあげてみてください。

レジストリ登録が成功したら、再起動後、エクスプローラでZIPの内容を
見ることができるできるかも確認してください。

投稿日時 - 2006-04-07 20:32:14

補足

こんばんは、1050YENさん。
シェルオブジェクト.NameSpace(パス文字列)は、
フォルダ一覧側で選択したような状態ですか。
何となくわかりました。

それで、、C:\WINNT\SYSTEM32フォルダ直下にzipfldr.dllを入れて、
コマンドプロンプトで上記ディレクトリに移動して、
"regsvr32 zipfldr.dll"コマンドを実行したのですが、
やっぱり同じエラーが出てしまいました。
何かやり方が間違っていたのでしょうか?

よろしくお願いしますです。

投稿日時 - 2006-04-08 02:04:24

ANo.5

以前の発言の当事者@5000円要求です。


ZIPFLDR.DLL
が、レジストリに登録されているかが関係するのかな?

http://osaka.cool.ne.jp/cyberidoc/cmd/092.html
http://www.lhut32.com/kanren.html

これでできないのであれば、アーカイバを利用する以外に思いつきません。

投稿日時 - 2006-03-24 13:42:19

補足

以下のような感じでZIPに関連しない部分だけ抜き出したサンプルでも
なぜかうまく行きませんでした。
(実際に動かしたコードと全く同じかは?ですが)

-----
Const DEF_ZIP_PATH = "C:\書庫.zip" '書庫保存先固定
Dim m_objFso
Dim m_objShell
Set m_objFso = CreateObject("Scripting.FileSystemObject")
Set m_objShell = CreateObject("Shell.Application")
If Not CreateZIP(p_strZipName, p_colParams) Then
  Exit Function
End If
Private Function CreateZIP(p_strZipName, p_colParams)
Dim l_objZIP
Set l_objZIP = m_objShell.NameSpace(CStr(p_strZipName))
End Function
-----

フォルダの権限等もadministratorなので問題ないはずなので、
これはW2Kがクラス(オブジェクト?)に非対応なのでしょうか?
m_objShell.NameSpaceに文字列を渡すだけのようですけど。。。

無理そうなら今回は一旦終了しますが何かあればお願いします。
今回解決できたら1050円なら本当に出してもいいと思ってます。

投稿日時 - 2006-04-02 12:45:42

ANo.4

>ZIPうんぬんとは関係ないようですけど。。。
そうですね。
ZIP.VBSのREADME(ZIP.TXT) には、確認できないがwindows2000で動くと思うというように書いてあったけど、してみると、動かなかったというわけですね。
誰か、Windows2000で他に試してみた人はいないのかな・
今は使っていないのですけど、
昔Windows2000を使っていたときの記憶によると、windows2000でエクスプローラーからフォルダを圧縮してZIPファイルを作れたような記憶があるんだけど・・

投稿日時 - 2006-03-24 01:25:14

お礼

例のコードを書いてくれた人に、動かなかった短いサンプルを見てもらってます。
もし、それで解決できないようなら今回は一旦保留にします。
また別の質問でお願いします。ありがとうございました。

投稿日時 - 2006-04-02 12:49:14

ANo.3

追伸です。Win2Kでも、コマンドラインのMakecab.exeは使えそうなので
これをShellで呼び出しても良さそうです。
キャビネットファイルはWinXPのZipファイルと同等の雰囲気?
検証はしていません。ごみレスご容赦を。

投稿日時 - 2006-03-23 23:58:46

お礼

最悪cabファイルでもやってみます。
自作のバックアップツールでバックアップファイルを圧縮したいだけなので、
できなかったらできなかったでしかたないと思ってます。
毎日15MBくらいのバックアップができるので、1週間でローテートさせればいいかなというところです。
またよろしくお願いします。ありがとうございました。

投稿日時 - 2006-04-02 12:53:29

ANo.2

あれはWindowsXPから可能となったZIPファイルをフォルダとして扱う機能を
利用してますのでWin2000では到底無理と思います。

VBSで何らかのDLLを扱えれば何とかなるのかもしれませんが、ちょっと分かりません

↓ここが参考となるかも
統合アーカイバプロジェクト
http://www.madobe.net/archiver/index.html

投稿日時 - 2006-03-23 02:56:09

お礼

やはりソースコード側の問題ではなかったんですね。。。
かなり調べましたが使い方は誤ってなかったですから。
教えていただいたURLを見てDLLとか探してみます。
ありがとうございました。

投稿日時 - 2006-03-23 23:26:55

ANo.1

windows2000でもNameSpace は、使えるはずなので、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/objects/shell/namespace.asp
引数として渡したフォルダの指定がおかしいか
権限がないんじゃないかと思います。

投稿日時 - 2006-03-23 00:46:10

お礼

BLUEPIXYさんはいろいろやってるんですね。
そう思ってもっと短くサンプルを作ってみたのですが、
やはり特段の間違いはありませんでした。
どうやらNo.2さんの書き込みのとおりの原因らしいです。
でも腑に落ちないのは、shell.applicationオブジェクトを作って、
そのNameSpaceメソッドを使ってるだけなのに、
ZIPうんぬんとは関係ないようですけど。。。

投稿日時 - 2006-03-23 23:32:33

あなたにオススメの質問