in reply to Re^2: Perl to mount a virtual filesystem on Windows?
in thread Perl to mount a virtual filesystem on Windows?

Thank you for getting back! I will try another compile-run as soon as possible.

Update: I actually managed to get a version together that threw only warnings on dmake. A subsequent dmake -i got me to a runnable version of Win32::Dokan.
Anyway, running examples/mirror.pl resulted in an error: "&Win32::Dokan::constant not defined at mirror.pl line 17" with line 17 being
14: my $fs = Mirror->new("D:/"); 15: my $mounter = Win32::Dokan::Mounter->new({debug_mode => 1, 16: use_std_err => 1}); 17: $mounter->mount('W', $fs);


Testing other combinations: this SVN version lacks a META.yml (the sourceforge version contains it) and using it with the modifications in Dokan.xs gave among warnings an error: "In function `set_file_time': Dokan.xs:296: error: incompatible types in assignment".

I hope this helps and you feel motivated for another release/patch on SVN: trunk that works more seamlessly with newer dokan.h.

Replies are listed 'Best First'.
Re^4: Perl to mount a virtual filesystem on Windows?
by Anonymous Monk on Apr 03, 2009 at 13:49 UTC

    I wrote small patch for starwberry perl. Try newer svn trunk with dokan.h(r7), please.

    I got good result with strawberry perl 5.8.9.

      Thank you for the patch. I really appreciate your effort!

      My experience this time was much smoother, but still not 100%. I fetched the newest revision from SVN and combined it with revision 7 of dokan.h. dmake ran through without error and resulted in a Dokan.dll in the blib\arch\auto\Win32\Dokan directory.

      But, as it seems, the dmake install routined did something wrong, I had to manually copy the .dll into my strawberry directory, so that Dokan.pm's "package Win32::Dokan::_DLL;" could find it in the ENV. (btw, I opted for the sub dir C:\strawberry\c\bin).

      In test-fs.t, ~line 33, there's is a typo in the path, see:
      for my $p (split(/;/, $ENV{PATH}), 'C:\\Program Files\\Dokan\\DokanLIbrary', 'D:\\Program Files\\Dokan\\DokanLIbrary',) {
      the capital "I". And the sub assumes Dokan to reside in the default location (which wasn't the case on my system, I installed it in Program Files\\DokanLibrary...

      Then:
      Another note: I think I was under a misconception about how Dokan works. I wasn't aware that I need to have Dokan installed! I thought, having the Dokan.dll alone would suffice. But a call for dokanctl.exe during the tests told me that I need to have it.
        Confusion in DLL loading

        As you understand now, Dokan library must be installed first. It provides

        • dokan.dll (Dokan user mode library)
        • dokan.sys (Dokan File System Driver)
        • mounter.exe (Dokan mounter service)

        and some files.

        See dokan-readme for detailes.

        Win32::Dokan's Dokan.DLL is just an interface between dokan.dll (Dokan Library's one) and Perl.

        Win32::Dokan's Dokan.DLL will be found by DynaLoader, so you does not need to copy it manually. It will be copied to default place (C:\strawberry\perl\site\lib\...) by executing "dmake install". I think this is an usual way for XS module.

        Win32::Dokan::_DLL searches Dokan Library's dokan.dll, not a Win32::Dokan's. If Dokan library is installed correctly, It will be found in System Folder.

        Test is improved
        • Waiting method for test-fs.pl is changed. Hard coded waiting time is removed.
        • To unmount test filessystem, unmount.pl is added Dokanctl.exe wil not be called now.

        (But this is little danger. If Win32::Dokan does not works correctly, test filesystem will be not unmounted. Any idea?)

        Thanks to your advice.