VBAのカンレトディレクトリをUNCで

ドライブレターありきのChDrive/ChDir

VBAでカレントディレクトリ(今のWindowsなら「カンレトフォルダ」という言い方が正しい?)を変更するには、ChDriveとChDirします。

VBAの話なので、Wordに限らずExcelやAccess等でも同じはず。さらにはVB6でも同じだと思うけど知らない。

C:\yamada\takaoへ変更する例

ChDrive "C:"
ChDir "yamada\takao" 'C:\yamada\takaoでも構わない

まるでコマンドプロンプトです。いや、cdコマンドに/dオプションがあるだけcmd.exeの方が賢いかも。

UNCが使えない

サーバー上のいわゆる共有フォルダを扱う際に、UNC(\\ServerName\FolderName…のような表記)を利用することがよくあります。ところが、ChDrive / ChDirではUNCを扱えません。きっと、VSTOへの移行を促したいM$の(地味な)陰謀であります。

SetCurrentDirectoryを使えばUNCでOK

Windows APIであるSetCurrentDirectoryを使えばUNCが使えます。”\\ServerName\FolderName”をカレントディレクトリとする場合は以下のとおりです。

Declare Function SetCurrentDirectoryW Lib "kernel32" (ByVal lpPathName As Long) As Long

Public Sub TestCd()
    SetCurrentDirectoryW StrPtr("\\ServerName\FolderName")
    Debug.Print CurDir
End Sub

実行結果は、

\\ServerName\FolderName

となります。

SetCurrentDirectoryAではなくSetCurrentDirectoryWがおすすめ

あくまで個人的な印象に過ぎませんが、Windows Vista(MS-IME 2007)が出てからファイル名にUnicodeが使われることが多くなっています。SetCurrentDirectoryAではUnicodeが使えないので、SetCurrentDirectoryWが良さそうです。

宣言時にlpPathNameをLongにすること、呼ぶ時にStrPtrを介すことに気をつけてください。

ところで、Officeが64bitになったらAPIも64bitの方を呼ぶんだろうな。そうなるとポインタを渡すときはLongじゃダメってことか。64bit……Double型??

余談

もちろん、

SetCurrentDirectoryW StrPtr("C:\yamada\takao")

でもいけますが、

SetCurrentDirectoryW StrPtr("\\?\C:\yamada\takao")

でもいけたりします。

ESXiからHyper-Vに仮想マシンをクローンするとブルースクリーン

現象

ESXi上のWindows Server 2003を入れている仮想マシンを、ClonezillaやAcronis TrueImage?等ディスクのイメージバックアップを取るソフトでクローンしても、Hyper-V上で起動するとブルースクリーンが表示されて起動しない。ブルースクリーンにはSTOP: 0x0000007Bと表示される。

原因

ブートディスクがSCSI→IDEになったため。

ESXiでウィザードに従ってWindows Server 2003の仮想マシンを作ると、ブートディスクはSCSIになる。一方で、Hyper-VはブートディスクはIDEであるため、起動できない。
Hyper-VでLinuxを動かそうと思ったことが無いけど、Linuxでもsda→hdaになるわけだから、GRUBとfstabいじらないとダメなんだろうな。

対応

クローンする前に以下のレジストリを入れておく。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\primary_ide_channel]
"Service"="atapi"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

ESXiのVMにIDEのCD-ROMドライブが設定されていることが前提。CD-ROMはセカンダリIDEになっているので、プライマリIDEのデバイスを追加してやれば良い。一切IDEデバイスが無い場合は色々面倒そう。

参考

  • http://support.microsoft.com/kb/314082/

逆(Hyper-V→ESXi)の場合

ESXiならば起動ディスクをIDEにできるので、素直にIDEを起動ディスクにすれば良い。Hyper-VはIDE以外起動ディスクにできないので、一手間必要。

VistaでMBSA2.1のmbsacliでセキュリティのCABファイルを読み込めません。

現象

Windows Vista x64に入れたMBSA 2.1で、

mbsacli /xmlout /unicode /nd /nvc /catalog wsusscn2.cab

とやると、

セキュリティの CAB ファイルを読み込めません。

って表示される。意味がわからんので英語版で試したら

Cannot load security CAB file.

だと。

特権が必要

コマンドプロンプトを管理者権限で動かしたら動いた。もっとましなメッセージは出せないのかな。
理由が理由なのでWindows 7やWindows XPでも起こるのでしょう。