DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal参照dllへの文字列引数をutf8で渡したい。(13) | NomalFILE.COPYでIOExceptionエラーが出る(11) | Nomalリストを別フォームに渡す方法(9) | Nomal例外発生した場合に変数をcatchに渡したい(9) | NomalCode128でバーコードが読み取れない(8) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | Nomal数字だけで構成されてるCSVフィールドが自動的に数値として解釈される(7) | NomalフォームコントロールへのDataBindingsでプロパティが相互反映されない(7) | Nomal起動ディスプレイの指定方法について(6) | NomalListBoxにデータが表示されない(6) | Nomal文字列を8bit に戻してから UTF-8 に変換する方法(6) | NomalSQLServerテーブル内容をDataGridViewに表示するコードについて(6) | Nomal文字列構造体のListのソート(6) | NomalWebBrowser Controlを使って、任意の値を取得(5) | Nomalこんな演算子初めて見ました。(5) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | Nomalポルトガル語の登録(5) | Nomaloo4oのAddTableをADOに移行したい(5) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | Nomalフォルダ内の全ての容量を取得したい(4) | Nomal共変性と反変性ってこういうこと?(4) | Nomalプロセスからウインドウを取得(4) | NomalNewの使い方間違ってますか?(4) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalJOIN操作の構文エラー(4) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | Nomalスクロールバーが出た時に高さを変えたい(4) | NomalDatagridViewの行高さ変更について(4) | NomalLINQのメソッド構文の書き方(3) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalPictureBox.Locationのキャンセル(3) | NomalCatch時のex.StackTraceの情報(3) | NomalVisualStudioでマクロ(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalDrawImage でメモリ不足エラー(3) | NomalVb.netからAccessへの接続について(3) | Nomal令和の日付への対応(3) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | NomalPIctureBox同士を論理合成したい(3) | Nomalデータセット定義ファイルからDataTable(3) | Nomalネットの画像の複数枚を重ね合わせたい(3) | NomalDataGridViewで検索をかける方法(3) | NomalDataGridViewの選択時の色を透明にしたい(3) | NomalWebBrowserでWebページからのメッセージ(3) | NomalASP.NETから呼ばれているかどうか判定する方法(3) | NomalCA2213の警告が消えません(3) | NomalC# 現在のコンテキスト内にxxxという文字は存在しませんと出ます(3) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalWebBrowser Control foreachで値が消える(2) | NomalEditボックスに簡体字をセットする方法(2) | NomalWebClientが上手く動かない(2) | Nomalフォーム外のカーソルの変更(2) | Nomalラムダ式の勉強中(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalC#をVBに変換(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalVC++ → VB.Netに変換時に文法エラー(2) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal自作したアプリの発行元を明記したい(2) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalDataGridView 行の背景色の設定(2) | NomalDatagridviewのクリア(2) | NomalnumericUpDwonコントロールのvalue(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDataTableの構造が同じか調べるメソッド(2) | NomalRejectChangesについて(2) | NomalPC機種によってスタートアップ画面が中央から左上にずれる、Fontがおかしくなる。(2) | Nomalタスクスケジュール登録時の例外メッセージ(2) | Nomal管理者モードでクリック(2) | NomalVB2017でのインストーラ作成時のエラーについて(2) | NomalMicrosoft Azure OCRのサンプルコード実行時エラー(2) | Nomalデータバインド時のDataGridViewのカスタムソート(2) | NomalObject型からDecimalへの変換(2) | Nomal擬似言語をVBのプログラミングに変換(2) | Nomalユーザーコントロールのプロパティが保存されない(2) | NomalWindows10(1803)からGetHostEntryでipv4が取得出来ない場合がある(2) | Nomal自分自身を呼び出すのはOKですか(1) | NomalList型でエラーが起きてしまい・・・(1) | NomalLINQの拡張メソッドの定義(1) | NomalWebRequest でメモリが解放されない(1) | NomalFunction プロシージャからの文字選択(1) | NomalRDP接続でのネットワーク帯域制限(0) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalWinFormsでWindows10のカメラアプリと連携したい(0) |



■記事リスト / ▼下のスレッド
■34034 / 親記事)  データバインド時のDataGridViewのカスタムソート
□投稿者/ ミンミン 一般人(1回)-(2018/11/15(Thu) 14:02:24)
  • アイコン環境/言語:[VB2013] 
    分類:[.NET] 

    DataGridViewのカスタマイズソートについて、以下には
    IComparerインターフェイスを使用する方法が紹介されています。

    DataGridViewの行の並び替えの方法を変更する
    〜DataGridView.Sortメソッドを使用する方法〜
    https://dobon.net/vb/dotnet/datagridview/customsort.html#section2

    この方法だと、かなり特殊なソート方法を定義できるので便利なのですが、
    「DataGridViewのDataSourceプロパティが設定されておらず...」
    という注釈があります。

    これは、DataGridViewにデータバインドしている場合には
    IComparerインターフェイスの方法が使用できない、と理解したのですが、
    データバインドを行った場合でも、IComparerインターフェイスのように
    かなり自由にソート方法を定義する方法はないでしょうか?
    バインドしたデータにソート値用の列を設けることも考えたのですが、
    新しい項目をバインド元データに用意するのもどうかと思い、
    質問した次第です。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34035 / ResNo.1)  Re[1]: データバインド時のDataGridViewのカスタムソート
□投稿者/ 魔界の仮面弁士 大御所(1168回)-(2018/11/16(Fri) 12:03:48)
  • アイコン
    No34034に返信(ミンミンさんの記事)
    > データバインドを行った場合でも、IComparerインターフェイスのように
    > かなり自由にソート方法を定義する方法はないでしょうか?
    
    手抜き実装だとこんな感じ。
    
    Imports System.ComponentModel
    
    Public Class Form1
        Private list As New SortableBindingList(Of Record)()
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            list.Add(New Record(4, "あああ"))
            list.Add(New Record(1, "いいい"))
            list.Add(New Record(999, "これを先頭にする"))
            list.Add(New Record(3, "ううう"))
            list.Add(New Record(5, "えええ"))
            list.Add(New Record(2, "あああ"))
            DataGridView1.DataSource = list
        End Sub
    End Class
    
    Public Class Record
        Implements IComparable, IComparable(Of Record)
        Public Property Id As Integer
        Public Property Name As String
        Public Sub New(id As Integer, name As String)
            Me.Id = id
            Me.Name = name
        End Sub
    
        Public Function CompareTo(other As Record) As Integer Implements IComparable(Of Record).CompareTo
            '★ここが独自の比較処理★
            If Id = 999 Then
                Return -1
            ElseIf other.Id = 999 Then
                Return 1
            Else
                Return Id.CompareTo(other.Id)
            End If
        End Function
    
        Private Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
            Return Me.CompareTo(DirectCast(obj, Record))
        End Function
    End Class
    
    Public Class SortableBindingList(Of T)
        Inherits BindingList(Of T)
        Protected Overrides ReadOnly Property SupportsSortingCore As Boolean
            Get
                Return True
            End Get
        End Property
        Protected Overrides Sub ApplySortCore(prop As PropertyDescriptor, direction As ListSortDirection)
            Dim list = TryCast(Items, List(Of T))
            If list Is Nothing Then
                Return
            End If
            list.Sort()
            OnListChanged(New ListChangedEventArgs(ListChangedType.Reset, -1))
        End Sub
    End Class
    
    
    上記は、レコード側に IComparable を付けただけなので、
    昇順/降順の切り替えや、別の列をソートするなどの対応が出来ません。
    
    降順などにも対応させたい場合には、ApplySortCore の引数もチェックします。
    また、その場合はレコード側に IComparable を実装するのではなく、
    IComparer(Of T) を実装したカスタムソート用のクラスを用意して、
    『list.Sort()』の代わりに『list.Sort( IComparer(Of T) )』を呼びだします。
    
    参考リンク
    https://garafu.blogspot.com/2016/09/cs-sorablebindinglist.html

違反を報告
引用返信
■34041 / ResNo.2)  Re[2]: データバインド時のDataGridViewのカスタムソート
□投稿者/ ミンミン 一般人(2回)-(2018/11/26(Mon) 15:03:36)
  • アイコン魔界の仮面弁士 さん、ありがとうございました。
    色々と試してみます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34003 / 親記事)  Object型からDecimalへの変換
□投稿者/ ちゅう太 一般人(1回)-(2018/10/10(Wed) 23:42:01)
  • アイコン環境/言語:[Windows7/.NET Framework 4.6.2] 
    分類:[.NET] 

    クラスを新規に作成し、Valueプロパティ(Object型)を作成しました。
    そのValueプロパティのSetterでObject型からDecimal型に変換したいのですが、
    皆様はどのように変換されているのでしょうか?
    (Valueプロパティには何型がセットされるかわからないものとした場合)

    現在はConvert.ToDecimal(object) を Try Catch End Try で挟んでいます。
    Object型をToStringメソッドでString型にしてから、Decimal.Parse等で変換するのでしょうか?

    Public Interface IInterface()
    Property Value() As Object
    End Interface

    Option Strict On
    Public Class ClassDecimal
    Implements IInterface

    Private myValue As Decimal = 0

    Public Property Value() As Object Implements IInterface.Value
    Get
    Return myValue
    End Get
    Set(value As Object)
    ' Decimalに変換できない場合はゼロとする
    If value Is Nothing Then
    myValue = 0
    Else
    Try
    myValue = Convert.ToDecimal(value)
    Catch
    myValue = 0
    End Try
    ' もしかして以下のほうがスマート?
    ' Dim result As Decimal = 0
    ' If Decimal.TryParse(value.ToString, result) Then
    ' myValue = result
    ' Else
    ' myValue = 0
    ' End If
    End If
    End Set
    End Property
    End Class

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34009 / ResNo.1)  Re[1]: Object型からDecimalへの変換
□投稿者/ 魔界の仮面弁士 大御所(1156回)-(2018/10/11(Thu) 17:37:43)
  • アイコンNo34003に返信(ちゅう太さんの記事)
    > そのValueプロパティのSetterでObject型からDecimal型に変換したいのですが、
    > 皆様はどのように変換されているのでしょうか?
    > (Valueプロパティには何型がセットされるかわからないものとした場合)

    「Decimal 以外の値」、たとえば String や Integer がセットされていた場合に
    変換を許容するのか否かで変わってきます。

    Decimal や Decimal? しか認めないなら、TryCast すれば良いですし、
    String からの変換が前提なら、Decimal.TryParse に文字列を渡しますし、
    何でも良いのでとにかく変換を試みるなら、CDec ですね。


    > Public Interface IInterface()
    この括弧は誤記でしょうか。それとも Of が省略されているとか?

    Public Class ClassDecimal
     Implements IInterface(Of Decimal)
     Public Property Value As Decimal Implements IInterface(Of Decimal).Value


    > 現在はConvert.ToDecimal(object) を Try Catch End Try で挟んでいます。
    「Decimalに変換できない場合はゼロとする」という仕様なのですね?



    > Object型をToStringメソッドでString型にしてから、Decimal.Parse等で変換するのでしょうか?
    Decimal.TryParse は、変換失敗時に出力引数へ Decimal.Zero を渡すことを
    保証していますから、If 文すら不要に思えます。
    https://msdn.microsoft.com/ja-jp/library/9zbda557.aspx

    加えて、出力先を Me.myValue にすることで、下記のように単純に書くことができます。


    'VB2015 以降
    Set(value As Object)
     Decimal.TryParse(value?.ToString(), myValue)
    End Set

    'VB2008〜VB2013
    Set(value As Object)
     Decimal.TryParse(If(value, "0").ToString(), myValue)
    End Set


    > ' もしかして以下のほうがスマート?
    注意点として、CDec / Convert.ToDecimal / Decimal.TryParse による処理は、
    同じ結果が保証されるものではない事を念頭において使い分ける必要があります。


    たとえば、value の中身が True だった場合、
    Convert.ToDecimal は「Decimal.One」となりますが、
    CDec は「Decimal.MinusOne」を返す仕様です。
    Decimal.TryParse では変換されずに「Decimal.Zero」になります。

    value の中身が vbCritical だった場合、
    CDec と Convert.ToDecimal は「16D」となりますが、
    Decimal.TryParse では変換されず「Decimal.Zero」になります。

    value の中身が "&H21" だった場合、
    CDec は「33D」となりますが、Convert.ToDecimal は例外。
    Decimal.TryParse は変換されず「Decimal.Zero」です。

    value の中身が 1.0R Mod 0.1R だった場合、
    CDec と Convert.ToDecimal は有効桁数 2 桁で「0.10D」になりますが
    Decimal.TryParse(value.ToString(), result) だと
    文字列化の際に末尾 0 が落ちるので「0.1D」になります。
    このケースでは、誤差を抑えるために、R 書式(ラウンドトリップ文字列)を用いて
    Decimal.TryParse($"{value:R}", result) のようにすると、
    「0.09999999999999995D」になりますが…汎用的では無くなりますね。

    ということで、TryParse を用いて変換する方法については、
    さらにその前の文字列化変換についても一考の余地があります。

    オブジェクトを文字列へ変換する手段としては、たとえば、
    obj.ToString() と Convert.ToString(obj) と CStr(obj) などがありますが、
    これら 3 つもまた、それぞれ異なる結果になりえますね。
違反を報告
引用返信
■34010 / ResNo.2)  Re[2]: Object型からDecimalへの変換
□投稿者/ ちゅう太 一般人(2回)-(2018/10/12(Fri) 00:03:11)
  • アイコン魔界の仮面弁士様
    この度は丁寧かつ詳細な説明ありがとうございます。

    > Decimal や Decimal? しか認めないなら、TryCast すれば良いですし、
    > String からの変換が前提なら、Decimal.TryParse に文字列を渡しますし、
    > 何でも良いのでとにかく変換を試みるなら、CDec ですね。
    CDec 等のデータ型変換関数は VB6の匂いがして、
    なんとなくですができるだけ使用をさけています。
    (といいながら、CTypeは結構使ったりしているので、矛盾してますね。)

    >>Public Interface IInterface()
    > この括弧は誤記でしょうか。それとも Of が省略されているとか?
    >
    > Public Class ClassDecimal
    >  Implements IInterface(Of Decimal)
    >  Public Property Value As Decimal Implements IInterface(Of Decimal).Value
    すいません。単純なタイプミスです。

    せっかくご教授いただいたので、インターフェースのジェネリック勉強したいと思います。
    ありがとうございます。

    > 「Decimalに変換できない場合はゼロとする」という仕様なのですね?
    はい。そのとおりです。
    「変換できない場合はエラーをThrowする」というのも考えたのですが、やめました。
    (それほど深い理由はありません。エラーのハンドリングがめんどうかな?というくらいの理由です。)

    > Decimal.TryParse は、変換失敗時に出力引数へ Decimal.Zero を渡すことを
    > 保証していますから、If 文すら不要に思えます。
    > https://msdn.microsoft.com/ja-jp/library/9zbda557.aspx
    Decimal.TryParseが失敗したとき、出力引数がDecimal.Zeroになること初めて知りました。
    別のソースで「Decimal.TryParseが失敗したときには出力引数は元通り」と勝手に解釈しているところがありました。
    ご教授感謝いたします。

    > 'VB2015 以降
    > Set(value As Object)
    >  Decimal.TryParse(value?.ToString(), myValue)
    > End Set
    >
    > 'VB2008〜VB2013
    > Set(value As Object)
    >  Decimal.TryParse(If(value, "0").ToString(), myValue)
    > End Set
    これはとてもシンプルでとっても気持ちいいですね。

    これまでは、「一回String型に変換して、Decimal型に変換する」というのは2回変換をかけるので、
    「どうかなぁ?」と思っていました。
    でもよく考えてみると「Object型になにが入っているかわからない」状態なので
    、(扱いやすい?)文字列に変換かけるというのも道理かな?と思うようになってきました。

    大変参考になりましたし、
    知らないことをたくさんご教授いただきました。

    本当にありがとうございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■33994 / 親記事)  擬似言語をVBのプログラミングに変換
□投稿者/ チェーンディストラクション 一般人(2回)-(2018/09/24(Mon) 17:49:35)
  • アイコン環境/言語:[VisualBasic] 
    分類:[その他] 

    タイトルの通りなんですが、基本情報技術者試験の午後試験の問8データ構造とアルゴリズムの問題の擬似言語をVBを使ってプログラミングに直そうと思うのですが、わかる方はいらっしゃいますでしょうか?
    実際の問題に関しては、後で写真ファイルとして送ります。どうかよろしくお願いします。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■33998 / ResNo.1)  Re[1]: 擬似言語をVBのプログラミングに変換
□投稿者/ Jitta 一般人(3回)-(2018/10/01(Mon) 21:56:56)
  • アイコンNo33994に返信(チェーンディストラクションさんの記事)
    > タイトルの通りなんですが、基本情報技術者試験の午後試験の問8データ構造とアルゴリズムの問題の擬似言語をVBを使ってプログラミングに直そうと思うのですが、わかる方はいらっしゃいますでしょうか?
    > 実際の問題に関しては、後で写真ファイルとして送ります。どうかよろしくお願いします。

    「プログラミングに直そう」の意味がわかりません。
    programing とは、program の現在進行形です。プログラムを行っている状態です。「疑似言語をVBを使ってプログラムしている状態に直す」・・・意味がわかりません。

違反を報告
引用返信
■33999 / ResNo.2)  Re[1]: 擬似言語をVBのプログラミングに変換
□投稿者/ みい 一般人(4回)-(2018/10/02(Tue) 10:11:45)
  • アイコンNo33994に返信(チェーンディストラクションさんの記事)
    > タイトルの通りなんですが、基本情報技術者試験の午後試験の問8データ構造とアルゴリズムの問題の擬似言語をVBを使ってプログラミングに直そうと思うのですが、わかる方はいらっしゃいますでしょうか?
    この問題でしょうか?
    (平成30年春期 午後問8)
    https://www.fe-siken.com/kakomon/30_haru/pm08.html

    どの個所が分からないのか具体的に挙げていただけると
    回答しやすいです。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■33962 / 親記事)  ユーザーコントロールのプロパティが保存されない
□投稿者/ 猫まっしぐら 一般人(5回)-(2018/08/14(Tue) 17:29:17)
  • アイコン環境/言語:[Windows7 VB.net2005] 
    分類:[.NET] 

    毎度お世話になってます
    
    ユーザーコントロールのプロパティ(Font,BackColor,ForeColor)が
    
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
        Public Overrides Property Font() As Font
            Get
                Return MyBase.Font
            End Get
    
            Set(ByVal val As Font)
                MyBase.Font = val
                MyFont = val
    
                Return
            End Set
        End Property
    
    とやっても貼り付けたフォームのデザインモードで保存されません
    とりあえずこの3つのプロパティ以外は保存されているようですし、プロパティ一覧でも
    ボールドにはなっていますが保存されません
    
    何が足りないのでしょう…

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34000 / ResNo.1)  Re[1]: ユーザーコントロールのプロパティが保存されない
□投稿者/ shu 大御所(482回)-(2018/10/09(Tue) 12:24:48)
  • アイコンNo33962に返信(猫まっしぐらさんの記事)

    保存されないというのはどのように確認されて判断されたのでしょうか?
    提示された内容はMyBase.Fontをそのまま使用しているので動作的には
    無いのと同じように思いますが、実際どのような動作をするのでしょうか?
違反を報告
引用返信
■34001 / ResNo.2)  Re[1]: ユーザーコントロールのプロパティが保存されない
□投稿者/ 魔界の仮面弁士 大御所(1150回)-(2018/10/09(Tue) 13:18:07)
  • アイコンNo33962に返信(猫まっしぐらさんの記事)
    > ユーザーコントロールのプロパティ(Font,BackColor,ForeColor)が

    Font や Color はアンビエント(ambient)なプロパティですので、
    既定値と初期値が異なります。

    デザイナーが各プロパティの値を正しく永続化できるよう、
    ShouldSerialize-プロパティ メソッドと、
    Reset-プロパティ メソッドを実装しておいてください。

    Private Function ShouldSerializeBackColor() As Boolean
    Private Sub ResetBackColor()

    もしもアンビエントであることを無視できる場合には、
    これらのメソッドの代わりに DefaultValue 属性を指定することもできます。

    https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods
    http://tech.junax.jp/custom-control-medium/wfcm-serialization/


    また、特定のプロパティ設定に応じて、他のプロパティの状態が
    変わるような場合は、 プロパティ-Changed イベントも実装するようにします。

    NotInheritable ではないクラスに イベントを追加実装する場合には、
    Protected Sub On-イベント名(e As EventArgs継承クラス) メソッドも加えます。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■33924 / 親記事)  Windows10(1803)からGetHostEntryでipv4が取得出来ない場合がある
□投稿者/ h-sake 一般人(1回)-(2018/07/20(Fri) 15:29:19)
  • アイコン環境/言語:[Windows10 64bit vb.net] 
    分類:[.NET] 



    ↓以下のようなロジックで他PCからホスト名を受け取って、IPアドレス(ipv4)を取得しています。
    *-------------------------------------------------------------------------------------*
    Dim clientInfo As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry("ホスト名")
    Dim IPAdr As System.Net.IPAddress = Nothing
    For Each adr As System.Net.IPAddress In clientInfo.AddressList
    If adr.AddressFamily = AddressFamily.InterNetwork Then
    IPAdr = adr
    Exit For
    End If
    Next
    *-------------------------------------------------------------------------------------*

    Windows10(1803)から上記ロジックで頻繁にIPアドレス(ipv4)が取得出来ない現象が発生しています。
    取得出来る場合もあり、現在調査中です。

    取得出来ない場合、
    上記処理で取得した[clientInfo.HostName]の値が、「ホスト名.local」になり、
    取得出来る場合は、[clientInfo.HostName]の値が、「ホスト名」になります。

    「.local」ですが、調べると「mDNS」というワードが出てきます。

    出来ればプログラムを変更せずにWindowsの設定変更で対応したいと考えています。
    ダメならプログラムを変更します。

    Windows10(1803)から発生している現象です。
    何か情報がある方教えて頂けないでしょうか。
    よろしくお願いいたします。










違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■33933 / ResNo.1)  Re[1]: Windows10(1803)からGetHostEntryでipv4が取得出来ない場合がある
□投稿者/ h-sake 一般人(2回)-(2018/07/24(Tue) 16:55:56)
  • アイコン自分で色々と調べて試した結果の中間報告です。

    最終的に
    ファイアウォールの「mDNS (UDP 受信)」と「mDNS (UDP 送信)」の設定を許可から拒否に変更するとうまく動作するようになりました。
    無効にしてもダメでした。拒否にすると何故かうまく行きます。


    ↓参考にした記事(自分の現象とは違いますが、試してみました)
    「Windows 10 April 2018 Update(バージョン 1803)の RDP 関連の残念なバグ」
    https://yamanxworld.blogspot.com/2018/06/windows-10-april-2018-update-1803-rdp_11.html

    「mDNS」の設定を変えると他に影響があるかも知れないですし、
    ファイヤーウォールの設定を変えなくてもうまく動作する環境もあるので、
    もっといい解決方法があると思うのでもう少し調査します。

    本当はプログラムを変更すればすぐに解決するんですが、プログラムの入れ替えの負荷が…
    クライアント側プログラムは自動更新出来るので、最終手段としてはクライアント側で解決するように考えています。

    何かいい方法があれば、よろしくお願いします。

違反を報告
引用返信
■34002 / ResNo.2)  Re[2]: Windows10(1803)からGetHostEntryでipv4が取得出来ない場合がある
□投稿者/ h-sake 一般人(7回)-(2018/10/10(Wed) 16:29:33)
  • アイコン
    解決するかも知れません。(^▽^)/

    ↓「Windows 10 Professional 64bit 1803 にアップデートし、「.net」経由でホスト名を取得すると、「外部関数の実行に失敗しました。」エラーが発生する。【Ver1803】」に新たに追記がありました。
    https://answers.microsoft.com/ja-jp/windows/forum/windows_10-networking/windows-10-professional-64bit-1803/54b4776a-f93a-42aa-9cd9-04c7b6d522a1


    内容は
    *----------------------------------------------------------------*
    本件ですが、マイクロソフトと一緒に調査を進め、

    結果として、「%Systemroot%\system32 の dnsapi.dll 」に不具合であることが分かりました。

    マイクロソフトにdnsapi.dllを修正いただき、この修正版で試したところIPv4とホスト名が正常に取得できるようになりました。

    この対応は

    ・Windows 10 1809(RS5)は初回から対応される。

    ・Windows 10 1803については12月のWindows Updateで対応される予定。

    とのことです。

    いろいろとありがとうございました。

    *----------------------------------------------------------------*

    まだ試していませんが、おそらく解決すると思うので質問を解決済みとさせていただきます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -