UNC Pfad

  • Versuche bitte mal nur, den Laufwerksbuchstaben umzuwandeln. Schreibe ihn direkt in das Skript. Dann hätte ich gerne Rückgabe und @error-Wert.

    [autoit]

    $ret = _WinNet_LetterToUNC("DEIN_NETZWERKLAUFWERK")
    MsgBox(0, "", $ret & @CRLF & "error: " & @error)

    [/autoit]
  • Wenn die Variable $iBuffer auf 500 setze, dann bekomme ich keine Fehlermeldung mehr zurück. Doch der Rückgabewert ($Filename) ist immer gleich 0.
    Was stimmt hier nicht?

    Spoiler anzeigen
    [autoit]

    Func UNCPath()
    Local $Filename, $tmp, $last

    [/autoit] [autoit][/autoit] [autoit]

    If WinActive("[CLASS:CabinetWClass]") = 0 Then Return -1 ;Return if not the Windows Explorer Windows is active!
    _ClipBoard_Empty() ;Clears Clipboard
    Send("^c") ;Ctrl + C
    While 1 ;Wait till Clipboard is captured (with Ctrl+C)
    $tmp = _ClipBoard_GetData(15) ;Get Clipboard Header Data
    If $tmp <> "" Then ExitLoop
    WEnd
    $tmp = BinaryToString($tmp, 2) ;Converts binary to String
    $tmp = StringTrimLeft($tmp, 10)
    $last = StringInStr($tmp, Chr(0), 1)
    If $last Then $Filename = StringLeft($tmp, $last -1) ;Filename contains now Path and filename, but not in UNC
    $Filename = _WinNet_LetterToUNC(StringLeft($Filename, 3))
    _ClipBoard_SetData($Filename)
    MsgBox(0,"",$Filename)
    EndFunc ;==>UNCPath

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinNet_LetterToUNC($sDriveLetter)
    ; Author: ProgAndy
    Local Static $sizeNETRESOURCE = DllStructGetSize(DllStructCreate($tagNETRESOURCE, 1))
    $sDriveLetter = StringLeft($sDriveLetter, 1)&':'
    Local $hEnum, $nStatus, $iCount, $iBuffer = 500, $tBuffer, $pBuffer, $iLen, $sLocalName, $tString, $pString, $tNETRESOURCE, $sRemoteName

    [/autoit] [autoit][/autoit] [autoit]

    If DriveStatus($sDriveLetter) = 'INVALID' Then Return SetError(1,0,'')
    If Not _WinNet_OpenEnum(0, 0, 0, 0, $hEnum) or $hEnum=0 Then Return SetError(2,0,'')

    [/autoit] [autoit][/autoit] [autoit]

    $iCount = -1
    _WinNet_EnumResource($hEnum, $iCount, 0, $iBuffer)
    If $iBuffer = 0 Then Return SetError(3,0,0)
    $tBuffer = DllStructCreate("byte[" & $iBuffer+1 & ']')
    $pBuffer = DllStructGetPtr($tBuffer)

    [/autoit] [autoit][/autoit] [autoit]

    $iCount = -1
    If _WinNet_EnumResource($hEnum, $iCount, $pBuffer, $iBuffer) Then
    For $i = 0 To $iCount-1
    $tNETRESOURCE = DllStructCreate($tagNETRESOURCE, $pBuffer+$i*$sizeNETRESOURCE)

    [/autoit] [autoit][/autoit] [autoit]

    $pString = DllStructGetData($tNETRESOURCE, 'LocalName')
    $iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
    If Not @error Then $iLen = $iLen[0]
    $sLocalName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)

    [/autoit] [autoit][/autoit] [autoit]

    If StringLeft($sLocalName, 2) = $sDriveLetter Then
    $pString = DllStructGetData($tNETRESOURCE, 'RemoteName')
    $iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
    If Not @error Then $iLen = $iLen[0]
    $sRemoteName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)
    _WinNet_CloseEnum($hEnum)
    Return $sRemoteName
    EndIf
    Next
    EndIf
    _WinNet_CloseEnum($hEnum)
    EndFunc

    [/autoit]