【Dokanチュートリアル】Windows版FUSE Dokanでオリジナルファイルシステムを作ろう!サンプルプログラムビルド方法編


 
 
FUSEって知ってますか?Unix、Linux用のソフトウェアで、オリジナルファイルシステムを簡単に作れる面白いソフトウェアです。
Filesystem in Userspace - Wikipedia


このFUSEのWindows版ともいえるのがDokanです。
Dokan


これを使えば、オリジナルデバイスをファイルシステム経由で制御したり、ネットサービスをファイルシステムとしてマウントしたりできます。Flickrをマウントした人もいるみたいですね。
WindowsでもFUSEの魅力を「Dokan」|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ



そんな面白いDokanには、指定したフォルダをドライブとしてマウントするサンプルが付いています。Dokanの挙動を理解するにはサンプルをビルドしてみるのが一番なんですが、ビルドにちょっとコツが必要だったのでまとめておきます。


今回は、Visual C++ 2010 Expressでビルドしてみました。Visual C++ 2010 Expressのダウンロード/インストール方法はこちらを見てください。
Visual Studio 2010 Expressのダウンロード方法(Visual C++,Visual C#,Visual Basicなど)



Dokanインストール


こちらからDokanをダウンロードしてインストールします。
Dokan ≫ Download

今回はDokanライブラリ0.6.0を使用しました。

注意

Dokan ライブラリ Readmeに書いてある通り、Dokanは仮想PCにインストールする事をお勧めします。

仮想PC環境の作り方はこちらを参考にしてください。
【無料でできる!】Windows 7 Enterprise 評価版+VMware Playerで仮想PC環境を作ろう
【無料でできる!】Windows 8 Enterprise 評価版+VMware Playerで仮想PC環境を作ろう



プロジェクト作成


Visual C++ 2010 Expressでプロジェクトを作成します。Win32 コンソールアプリケーション(空のプロジェクト)を生成してください。今回は、mirrorという名前でプロジェクトを作りました。

一応、手順を載せておきます。

20130223_01_project.png
※クリックで拡大します。

20130223_02_next.png

20130223_03_empty.png


プロジェクト設定


サンプルのソースコードは
C:\Program Files (x86)\Dokan\DokanLibrary\sample\mirror\mirror.c (64bit OSの場合)
C:\Program Files\Dokan\DokanLibrary\sample\mirror\mirror.c (32bit OSの場合)
です。このファイルを先ほど作成したプロジェクトに追加しましょう。

また、Dokanライブラリを使うには、
C:\Program Files (x86)\Dokan\DokanLibrary\dokan.lib (64bit OSの場合)
C:\Program Files\Dokan\DokanLibrary\dokan.lib (32bit OSの場合)
が必要になります。

このファイルも先ほど作成したプロジェクトに追加しましょう。


プロジェクトへの追加方法は簡単です。ファイルをソリューションエクスプローラ上のプロジェクト名(mirror)にD&Dするだけです。

20130223_04_add.png

プロジェクトにmirror.cとdokan.libが追加された状態がこちらです。

20130223_05_project.png


次にプロジェクトの設定を行います。ソリューションエクスプローラのmirrorを右クリックして、プロパティを選択します。

mirrorプロパティページが表示されるので、左上の[構成]をすべての構成に変更して、[C/C++]-[全般]-[追加のインクルードディレクトリ]に
C:\Program Files (x86)\Dokan\DokanLibrary (64bit OSの場合)
C:\Program Files\Dokan\DokanLibrary (32bit OSの場合)
を設定します。

20130223_06_property.png

[OK]を押してプロパティページを閉じます。


ビルド


では、ビルドです。。。エラーが出ますね。
c:\program files (x86)\dokan\dokanlibrary\sample\mirror\mirror.c(29): fatal error C1083: include ファイルを開けません。'fileinfo.h': No such file or directory

fileinfo.hは必要ないので、#include "fileinfo.h" の行をコメントアウトします。

再度ビルドします。。。まだエラーが出ますね。
c:\program files (x86)\dokan\dokanlibrary\sample\mirror\mirror.c(1100): error C2440: '=' : 'int (__cdecl *)(LPCWSTR,DWORD,DWORD,DWORD,DWORD,PDOKAN_FILE_INFO)' から 'int (__stdcall *)(LPCWSTR,DWORD,DWORD,DWORD,DWORD,PDOKAN_FILE_INFO)' に変換できません。

これは呼び出し規約が異なる為に起きるエラーです。エラーが起きている行を見てみると、
 dokanOperations->CreateFile = MirrorCreateFile;
と書かれてますね。

このdokanOperations->CreateFileは呼び出し規約__stdcallの関数を期待しています。一方、MirrorCreateFile()は呼び出し規約__cdeclです。呼び出し規約が合わないためにエラーになっているんです。


コンパイラオプション/Gzを付ける事で正常にビルド出来る様になりますが、これだと今後使いづらいので、ソースを修正する事にします。

MirrorCreateFile()の定義を

static int
MirrorCreateFile(

から

static int DOKAN_CALLBACK
MirrorCreateFile(

に修正します。

dokan.h(追加のインクルードディレクトリで指定したフォルダにあります)を見ると、DOKAN_CALLBACKは
#define DOKAN_CALLBACK __stdcall
と定義されていますね。

これにより、MirrorCreateFile()が呼び出し規約__stdcallでビルドされます。


MirrorCreateFile()以外にも同様のエラーが出ているはずですので、エラーが出ている関数全てを同様に修正します。


最後に、main()の定義を

int __cdecl
wmain(ULONG argc, PWCHAR argv[])

から

int
wmain(ULONG argc, PWCHAR argv[])

に変更します。


これでビルドすれば、正常にビルドが完了し、mirror.exeが生成されます。


サンプル実行


mirror.exeに以下のオプションを付けて実行します。
/r c:\ /l z /t 1 /d /s

Visual C++ 2010 Expressでデバッグする際には、mirrorプロパティページの[デバッグ]-[コマンドライン引数]に設定します。

20130223_08_debug-2.png


実行すると、エクスプローラにDOKAN(Z:)というドライブが現れています。中身を見ると、/rオプションで指定したフォルダの中身がそのまま見えます。だからmirrorなんですね。

20130223_09_dokan.png


これだけだと、substコマンドとなんら変わりませんが、これを応用すればFlickrをマウントしたり、RAMドライブを作ったり、オリジナルのデバイスをファイルシステム経由で制御したりなんて事が可能になります。


ぜひ、試してみてください。



Sponsored Link


 
◆◇◆この記事が役に立ったらポチッとお願いします◆◇◆

 

テーマ : ソフトウェア
ジャンル : コンピュータ

コメントの投稿

非公開コメント

おすすめ







 



カテゴリ