フォルダの共有をするには?


MAKOTO  2004-01-23 18:53:18  No: 81672  IP: [192.*.*.*]

いつもお世話になっております。
Windows98、MEでフォルダの共有をしたいのですが、
色々なサイトでサンプル等があったのでそれを使用して
共有することはできたのですが、
再起動すると共有がはずれて(共有しないの状態)しまいます。

ソースには再起動後に再接続と書いているのですが、わからない状態です。
なにとぞよろしくお願いいたします。
環境  VB6 SP-5

'リソースの共有を追加
Private Declare Function NetShareAdd Lib "SVRAPI.DLL" _
                                         (ByVal pszServer As String, _
                                          ByVal sLevel As Integer, _
                                          ByRef pbBuffer As share_info_50, _
                                          ByVal cbBuffer As Integer) As Long

'メモリーコピー
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
                                              (ToData As Any, FromData As Any, ByVal Length As Long)

Private Const LM20_NNLEN = 12
Private Const SHPWLEN = 8

'リソースの種類
Private Const STYPE_DISKTREE = 0

'アクセス権限
Private Const SHI50F_FULL = &H2&        'フルアクセス
Private Const SHI50F_PERSIST = &H100&   'OS再起動時に再接続する

Private Type share_info_50
    shi50_netname(LM20_NNLEN)  As Byte
    shi50_type                 As Byte
    shi50_flags                As Integer
    shi50_remark               As Long
    shi50_path                 As Long
    shi50_rw_password(SHPWLEN) As Byte
    shi50_ro_password(SHPWLEN) As Byte
End Type

Private Sub Command1_Click()

    Dim info50    As share_info_50
    Dim ShareName As String
    Dim SharePath As String
    Dim Comment   As String
    Dim Pass      As String
    Dim strbuf1   As String
    Dim strbuf2   As String
    
    gfunSetFolder_98 = False
    
    '共有名 12バイトまで
    ShareName = "test"

    '共有フォルダのフルパス
    SharePath = UCase("C:\test")

    Comment = ""
    Pass = ""

    With info50
        '共有名
        Call CopyMemory(.shi50_netname(0), ByVal ShareName, LM20_NNLEN)

        .shi50_type = STYPE_DISKTREE

        'フルアクセス&再起動時に再接続
        .shi50_flags = SHI50F_FULL Or SHI50F_PERSIST

        'コメント
        If Comment <> "" Then
            strbuf1 = StrConv(Comment, vbFromUnicode)
            .shi50_remark = StrPtr(strbuf1)
        End If

        'フォルダのパス
        strbuf2 = StrConv(SharePath, vbFromUnicode)
        .shi50_path = StrPtr(strbuf2)

        'パスワード
        If Pass <> "" Then
            Call CopyMemory(.shi50_rw_password(0), ByVal Pass, SHPWLEN)
        End If
    End With

    If NetShareAdd(vbNullString, 50, info50, Len(info50)) = 0 Then    
        MsgBox "フォルダの共有を追加しました", vbInformation
    Else
        MsgBox "フォルダの共有に失敗しました", vbExclamation
    End If

End Sub

編集    削除
岡田 之仁  2004-01-23 19:37:43  No: 81673  IP: [192.*.*.*]

WNetAddConnection2 API でできますが・・・

ただ、Win95/98/98SE/Me では環境が無いので
試したことがありません。

尚、起動時の再接続ですが・・・
ネットワークの設定で、優先ログオンが、何になっているか
が影響すると思いますが・・・

以上。

編集    削除
MAKOTO  2004-01-23 20:48:31  No: 81674  IP: [192.*.*.*]

お早いお返事ありがとうございます。

起動時の再接続ですが設定は
Microsoft ネットワーク クライアント
なのですがうまくいきませんでした。

WNetAddConnection2 API でできるとのことですので
少し調べてみたいと思います。
ただ、NT系(Win2000、XP等)は netapi32.dll の NetShareAdd で
うまく動作しているので、できれば現在の API の方で
できるとうれしいのですが・・・。

編集    削除
岡田 之仁  2004-01-24 03:16:19  No: 81675  IP: [192.*.*.*]

ヘルプで確認されましたか?

NetShareAdd は・・・
Administrators または Account Operators ローカルグループのメンバ、
あるいは Communication Operators、Print Operators、Server Operators
のいずれかのグループのメンバだけがこの関数を実行できます。
Print Operator はプリンタキューだけを追加できます。
Communication Operator は、通信デバイスキューだけを追加できます。

とあります。

また、NT/2000/XP系と、95/98系とで、4番目のパラメータの扱い
が違いますので、同一のプログラムでは解決できません。
OSの種別を判定して、区別して動作させなければなりません。

※  あくまで環境が無いので推測!

ですので、NT/2000/XP 系と、95/98系とで区別の無いAPIの方が
安全のように思いますが・・・

まぁ〜お試し下さい。

以上。

編集    削除
MAKOTO  2004-01-26 18:10:31  No: 81676  IP: [192.*.*.*]

ヘルプは確認しております。

はじめに書かせていただいたように
プログラム実行後はきちんと共有されているので
権限がなければその段階で共有されていないかな?と思います。

きちんと使用しているOSを判別して
各々のプログラムを走らせるようにはしています。
たしかに同じAPIを使用しないほうが安全かもしれないですね。

まだ少ししか調べれてないのですが、
WNetAddConnection2 はネットワークドライブの割当が
できるのはわかったのですが共有が探せきれてません。
もしよろしければフォルダ共有のサイトでもあれば
教えていただけるとありがたいです。
なにとぞよろしくお願いいたします。

編集    削除