DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33340 / inTopicNo.1)  VB.NETでネットワークドライブの割り当てダイアログを表示したい
  
□投稿者/ ちんぷい 一般人(1回)-(2016/04/28(Thu) 00:50:13)
  • アイコン環境/言語:[VB2005 WIN7] 
    分類:[.NET] 

    2016/04/28(Thu) 06:15:16 編集(投稿者)
    2016/04/28(Thu) 04:55:47 編集(投稿者)

    「ネットワークドライブの割り当てダイアログを表示する vb.net」でGOOGLE検索しましたがうまくいきません
    ネットワークドライブの割り当てダイアログの表示の方法を教えていただけませんでしょうか


    現在やってみたコード

    <宣言>
    Declare Function WNetConnectionDialog Lib "mpr.dll" _
    (ByVal hwnd As Long, ByVal dwType As Long) As Long
    Const RESOURCETYPE_DISK = &H1

    Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long

    Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long


    <以下コード>
    ’一番手前のフォームのハンドルを取得
    Dim HWND As Long
    HWND = GetForegroundWindow
    Console.WriteLine(HWND)

    ’フォームのタイトルを書き換えて正しくハンドルが取得できているか確認する
    Dim Ret As Long
    Ret = SetWindowText(HWND, "ABC")

    ’ネットワークドライブを呼び出す
    If WNetConnectionDialog(HWND, RESOURCETYPE_DISK) = 0 Then
    MsgBox("接続成功!")
    Else
    MsgBox("接続失敗!")
    End If


    <結果>
    1.手前のウインドウのハンドルはConsole.WriteLine(””)に「8586231385298766764」と表示されました
    2.手前のウインドウのタイトルは書き換え成功(でも文字化けしています)
    なのでハンドルは取得できていると思います
    3.ネットワークドライブのダイアログは開かずに接続失敗のメッセージが表示されます

    4.ちなみに引数のハンドル HWND を nothingにしてみても同じ結果でした






引用返信 削除キー/
■33341 / inTopicNo.2)  Re[1]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ Azulean 大御所(464回)-(2016/04/28(Thu) 06:48:55)
  • アイコンNo33340に返信(ちんぷいさんの記事)
    > <宣言>
    > Declare Function WNetConnectionDialog Lib "mpr.dll" _
    > (ByVal hwnd As Long, ByVal dwType As Long) As Long
    > Const RESOURCETYPE_DISK = &H1
    >
    > Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long
    >
    > Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

    このあたりの宣言は VB6 向けのコードを参考にされている、または VB6 時代のルールで書かれていませんか?
    VB.NET では Long 型が 8 バイトになるので、サイズが間違っています。

    ・dwType は DWORD、4 バイト型なので Long 型ではなく、Integer 型を使う
    ・hwnd はハンドルなので IntPtr 型を使う
    ・デフォルトは Unicode で文字列を渡すと思われるので、Alias で無理矢理 ANSI 関数(末尾が A)を呼び出すと文字化け

    PINVOKE.NET などを参考に正しく書きましょう。
    http://www.pinvoke.net/default.aspx/user32/SetWindowText.html


    ところで、自分のフォームのウィンドウハンドルが欲しいなら、Form の Handle プロパティで取得できますのであえて GetForegroundWindow を呼ぶ必要はありません。

引用返信 削除キー/
■33342 / inTopicNo.3)  Re[1]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ 魔界の仮面弁士 大御所(1017回)-(2016/04/28(Thu) 10:08:32)
  • アイコンNo33340に返信(ちんぷいさんの記事)
    > 現在やってみたコード

    コードの誤りは、すでに Azulean さんが指摘されているので説明を省きますが:


    > ネットワークドライブの割り当てダイアログの表示の方法を教えていただけませんでしょうか

    ダイアログの表示だけが目的なら、下記の一行だけで済みますよ。

    Process.Start("RUNDLL32", "SHELL32.DLL,SHHelpShortcuts_RunDLL Connect")
引用返信 削除キー/
■33348 / inTopicNo.4)  Re[2]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ ちんぷい 一般人(2回)-(2016/04/29(Fri) 19:29:38)
  • アイコン2016/04/29(Fri) 19:30:08 編集(投稿者)

    ご教授ありがとうございます
    Azulean さんのアドバイスに従って下記に修正したら無事ダイアログが表示されました
    でも戻り値は0ではないようで接続失敗のメッセージが出てしまいました

    <宣言>
    Declare Function WNetConnectionDialog Lib "mpr.dll" _
    (ByVal hwnd As IntPtr, ByVal dwType As Long) As integer
    Const RESOURCETYPE_DISK = &H1

    <以下コード>
    ’ネットワークドライブを呼び出す
    If WNetConnectionDialog(nothing, RESOURCETYPE_DISK) = 0 Then
    MsgBox("接続成功!")
    Else
    MsgBox("接続失敗!")
    End If



    SetWindowText 
    はもう少し勉強してからやってみます


    しかしながら、
    魔界の仮面弁士さんの
    Process.Start("RUNDLL32", "SHELL32.DLL,SHHelpShortcuts_RunDLL Connect")
    がやりたいことそのものでしたので
    今回はこちらのコードをありがたく採用させていただきました



    今後、ファイルの移動コピー削除といったファイル操作を
    vb.netからAPIを使ってやってみたいともくろんでいます
    (なぜかvb.netのコードだとファイル操作が非常に遅いので・・・)

    教えていただいたPINVOKE.NET がAPIに詳しそうですので勉強しながらやってみたいと思います


    今回は本当にありがとうございました



解決み!
引用返信 削除キー/
■33350 / inTopicNo.5)  Re[3]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ 魔界の仮面弁士 大御所(1020回)-(2016/04/29(Fri) 20:13:32)
  • アイコンNo33348に返信(ちんぷいさんの記事)
    > Declare Function WNetConnectionDialog Lib "mpr.dll" _
    > (ByVal hwnd As IntPtr, ByVal dwType As Long) As integer

    なぜ dwType As Long に…? (^^;

    Azulean さんの指摘を再掲:
    >> ・dwType は DWORD、4 バイト型なので Long 型ではなく、Integer 型を使う


    As Long というのは、As Int64 と同義ですよね。
    しかし、dwType の元の型は DWORD 型です。
    https://msdn.microsoft.com/ja-jp/library/cc447010.aspx


    DWORD というのは「符号なし 32bit 整数型」であるため、
    VB6 では「符号付き 32bit 整数型」である Long を使うことが
    多かったのですが、今回使用しているのは VB.NET ですよね。

    VB.NET なら「符号なし 32bit 整数型」である As UInteger (または As UInt32)
    あるいは、「符号付き 32bit 整数型」である As Integer (または As Int32)を
    利用して宣言するべきです。

    Win32 API の型との対比表が、下記にまとめられています。
    http://www.nda.co.jp/memo/dim.html
解決み!
引用返信 削除キー/
■33354 / inTopicNo.6)  Re[4]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ ちんぷい 一般人(3回)-(2016/04/30(Sat) 06:52:37)
  • アイコンすみません!

    <宣言>
    Declare Function WNetConnectionDialog Lib "mpr.dll" _
    (ByVal hwnd As IntPtr, ByVal dwType As integer) As integer

    やってみたのは上記だったと思います
    テストしたコードを思い出しながら掲示板の画面から修正したため
    間違たのかもしれません(汗

    すみませんでした

引用返信 削除キー/
■33355 / inTopicNo.7)  Re[5]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ ちんぷい 一般人(4回)-(2016/04/30(Sat) 06:53:50)
  • アイコンすみません
    解決とします
解決み!
引用返信 削除キー/
■33370 / inTopicNo.8)  Re[1]: VB.NETでネットワークドライブの割り当てダイアログを表示したい
□投稿者/ 魔界の仮面弁士 大御所(1028回)-(2016/05/13(Fri) 12:31:33)
  • アイコン
    No33340に返信(ちんぷいさんの記事)
    
    元記事のコードを、動作するように書き換えたモノを貼っておきます。
    32bit/64bit 両方で動作確認。
    
    解決済みフラグは付けたままにしておきます。
    
    
    '---------------
    Imports System.ComponentModel
    Imports System.Runtime.InteropServices
    '---------------
    Private Const RESOURCETYPE_DISK As Integer = 1
    Private Declare Function WNetConnectionDialog Lib "mpr" (ByVal hWnd As IntPtr, Optional ByVal dwType As Integer = RESOURCETYPE_DISK) As Integer
    Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
    Private Declare Auto Function SetWindowText Lib "user32" (ByVal hWnd As IntPtr, ByVal lpString As String) As Boolean
    '---------------
    Dim HWND As IntPtr = GetForegroundWindow()
    Dim Ret As Boolean = SetWindowText(HWND, "ABC")
    Dim dlg As Integer = WNetConnectionDialog(HWND, RESOURCETYPE_DISK)
    If dlg = 0 Then
        MsgBox("接続成功!")
    ElseIf dlg = -1 Then
        MsgBox("キャンセル")
    Else
        MsgBox("接続失敗:" & CStr(dlg))
    End If

解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -