Ras通信について

解決


no-fly-bird  2005-01-18 07:28:11  No: 87863

VB初心者なのですが、
VB6.0 Win2000の環境において、APIでRasGetEntryDialParams, RasSetEntryDialParamsを使用してダイアルアップ情報の取得、変更を試みてますが
(できえば、発信番号の取得及び変更)構造体のサイズが異なるのかうまくいきません???
質問が分かりづらいかもしれませんが、アドバイスをよろしくお願いします。


loan-bird  2005-01-18 10:14:34  No: 87864

既に、ご存知とは思いますが、RASAPI関数を使用する場合、Windows Platform によって構造体サイズが異なることがありますので、
1.現在使用されている関数、構造体、定数の宣言
2.うまくいかない内容とそれが再現される最小限のコード
3.API関数の戻り値
などを載せると、回答が得られるかもしれません。


no-fly-bird  2005-01-18 23:00:02  No: 87865

loan-birdさんお返事ありがとうございます。
>1.現在使用されている関数、構造体、定数の宣言
>2.うまくいかない内容とそれが再現される最小限のコード
コードはVisual Basic StationというサイトにRasの特集(RASエントリプロパティ取得設定)が記載されていたのでそこのコードとほぼ同じです。

関数RasGetEntryPropertiesを使用しており、構造体のサイズはサイトを見てもらった方がよいかと思います。

>3.API関数の戻り値
戻り値が632  構造体のサイズが間違っていますと出ています。

もともと、WinNTの仕様のためなのかうまくいかないのかもしれませんが、
よろしければ、ご返答よろしくお願いします。


魔界の仮面弁士  2005-01-19 00:28:56  No: 87866

> コードはVisual Basic StationというサイトにRasの特集(RASエントリプロパティ取得設定)が記載されていたのでそこのコードとほぼ同じです。
それならば、VBStationの掲示板で質問するべきなのでは。

> 戻り値が632  構造体のサイズが間違っていますと出ています。
見てみました。サンプルが間違っていそうですね。
管理人さんには、私から連絡しておきましょうか。

そのサンプル中の pRasGetEntryProperties 関数で、
》lngRet = RasGetEntryProperties(vbNullString, strEntryName, 0, lngEntrySize, 0, lngDeviceSize)
と書かれている部分を、
》lngRet = RasGetEntryProperties(vbNullString, strEntryName, ByVal 0&, lngEntrySize, ByVal 0&, lngDeviceSize)
に変更しておいてください。

# 元のソースのままだと、
# lngRet = RasGetEntryProperties(vbNullString, strEntryName, ByVal VarPtr(0), lngEntrySize, ByVal VarPtr(0), lngDeviceSize)
# の意味になってしまうかな。


loan-bird  2005-01-19 00:33:08  No: 87867

>> 1.現在使用されている関数、構造体、定数の宣言
>> 2.うまくいかない内容とそれが再現される最小限のコード
> コードはVisual Basic StationというサイトにRasの特集(RASエントリプロパティ取得設定)が記載されていたのでそこのコードとほぼ同じです。

> 関数RasGetEntryPropertiesを使用しており、構造体のサイズはサイトを見てもらった方がよいかと思います。

問題点を絞り込んで整理した方が、回答が得られ易いと思って書いたんですが....
私に限っては、VBStationさんのサンプルを解析するつもりはありません。

昔、VBStationさんのサンプルを拝見した時の記憶では、構造体メンバのフィールド長を指定する定数(RAS_MaxEntryName等)や構造体を、Win95系とNT系で使い分けしている様ですが、RAS.Hでは、Windowsのバージョン(WINVER)で振り分けている。
と、いう違いがあったと思います。

> もともと、WinNTの仕様のためなのかうまくいかないのかもしれませんが

RAS.Hが正しいと思うので、Win2000の場合も、VBStationさんのサンプルにある
Win95用の定数や構造体を使用してみては如何ですか?


no-fly-bird  2005-01-19 03:22:18  No: 87868

魔界の仮面弁士さん、loan-birdさん
お返事ありがとうございました。ご指摘のとおりでした。
解決しました。ありがとうございました。


no-fly-bird  2005-01-19 13:10:27  No: 87869

解決後にすいません。
同サイトにRasEnumDevicesでデバイスの取得もできると書いてあったのですが、
サンプルは95用だったので2000でも使用しようとしてるのですが、またもや、
構造体のサイズが違うと。。。。
RAS_MaxDeviceName のサイズ(32に変更)違いだけかと思ったのですがうまくいかず、また、質問したしだいです。

Public Const RAS_MaxDeviceType = 16&
Public Const RAS_MaxDeviceName = 32&

Type RASDEVINFO     'RASDEVINFO構造体
    dwSize As Long
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS_MaxDeviceName) As Byte
End Type

たびたびすいません。よろしければ、ご返答を。


魔界の仮面弁士  2005-01-19 17:45:50  No: 87870

サンプルに対する質問なら、サンプルを書いた人にききましょう。
自分で書いたコードなら、その書いたコードを提示しましょう。
断片的な質問では、断片的な回答しかできませんよ。

> Public Const RAS_MaxDeviceType = 16&
それでも問題ありませんが、できれば、
  Public Const RAS_MaxDeviceType As Long = 16&
のように、データ型も明示した方が良いですよ。

> 構造体のサイズが違うと。。。。
で。dwSizeには何を指定されているのでしょうか?


no-fly-bird  2005-01-19 22:25:55  No: 87871

すいません。コードは以下のようになっています。サイトの方にも質問してみます。

[モジュール]
Public Const RAS_MaxDeviceType As Long = 16&
Public Const RAS_MaxDeviceName As Long = 32&

Type RASDEVINFO     'RASDEVINFO構造体
    dwSize As Long
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS_MaxDeviceName) As Byte
End Type

'RASデバイス名取得
Declare Function RasEnumDevices Lib "RasApi32.DLL" Alias "RasEnumDevicesA" (lpRasDevInfo As Any,lpcb As Long, _
lpcDevices As Long) As Long

[フォーム]
 Dim i As Long                       'ループカウンタ
    Dim lngRet As Long                  'API戻り値
    Dim lngLen As Long                  '必要バッファサイズ
    Dim lngLenBlock As Long             'RASDEVINFO構造体バッファサイズ
    Dim lngCount As Long                'デバイス数
    Dim typeRASDEVINFO As RASDEVINFO    'RASDEVINFO構造体
    Dim tbRASDEVINFO() As RASDEVINFO    'RASDEVINFO構造体配列
    Dim byteRASDEVINFO() As Byte        'RASDEVINFOバイト配列
    
    '構造体のサイズ、デバイス数の取得
    '*------------------------------------------------------------*
    '第1引数の RASDEVINFO 構造体 に NULL
    '第2引数のバイトサイズに 0
    '第3引数のデバイス数に 0
    'を指定して、RasEnumDevices関数を実行する事により、lngLen, lngCounに
    '必要バイトサイズ、デバイス数を取得します。
    '*---------------------------------------------------------*
    lngRet = RasEnumDevices(vbNullString, lngLen, lngCount)
    
    If lngRet = ERROR_BUFFER_TOO_SMALL Then
        If lngLen > 0 And lngCount > 0 Then
            'RASDEVINFO構造体配列数設定
            ReDim tbRASDEVINFO(lngCount - 1)
            '取得バッファサイズより、RASDEVINFO構造体サイズ計算
            lngLenBlock = lngLen
            If lngCount > 1 Then
                lngLenBlock = lngLen \ lngCount
            End If
            tbRASDEVINFO(0).dwSize = lngLenBlock
            'バッファを確保
            ReDim byteRASDEVINFO(lngLen - 1)
        
            'RASDEVINFO構造体をバッファに移動
            Call MoveMemory(byteRASDEVINFO(0), tbRASDEVINFO(0),lngLen)
        
            'RASデバイスの取得
            lngRet = RasEnumDevices(byteRASDEVINFO(0), lngLen,                    lngCount)
            If lngRet = 0 Then
                'バッファをRASDEVINFO構造体に移動
                Call MoveMemory(tbRASDEVINFO(0), byteRASDEVINFO(0), Len(typeRASDEVINFO) * lngCount)
                'デバイスの列挙
                For i = 0 To lngCount - 1
                    With tbRASDEVINFO(i)
                                        List1.AddItem "[" & _
                                        Left$(StrConv(.szDeviceType(), vbUnicode), InStr(StrConv(.szDeviceType(), vbUnicode), Chr$(0)) - 1) & _
                                        "]" & Chr(9) & _
                                        Left$(StrConv(.szDeviceName(), vbUnicode), InStr(StrConv(.szDeviceName(), vbUnicode), Chr$(0)) - 1)
                    End With
                Next i
            Else
                MsgBox PRasGetErrorString(lngRet), vbCritical, "RasEnumDevicesエラー"
            End If
        Else
            MsgBox "デバイスが存在しません。", vbCritical, "RasEnumDevicesエラー"
        End If
    Else
        MsgBox PRasGetErrorString(lngRet), vbCritical, "RasEnumDevicesエラー"
    End If
End Sub


魔界の仮面弁士  2005-01-19 23:52:03  No: 87872

うーむ。貼り付けて、すぐに試せるコードになっていませんね……。

断片的なコードを載せるなら、せめて、
どの行で、どんなエラーが出ているのかも書きましょう。

> lngRet = RasEnumDevices(vbNullString, lngLen, lngCount)
まず、ここが問題(のひとつ)ですね。
というか、昨日(15:28:56)の回答と同じ原因ですよ。(^_^;)

「ByVal」と「ByRef」が、DLL呼び出し時にどのような意味を持つのか、
きちんと把握するようにしておいてください。

《Declare側を変更し、呼び出し側のコードを変更しない場合》
修正案1) API宣言側を ByVal lpRasDevInfo As Any にする。
修正案2) API宣言側を ByVal lpRasDevInfo As String にする。

《Declare側は変更せず、呼び出し側のコードを変更する場合》
修正案3) 第一引数を「ByVal vbNullString」で渡すようにする。
修正案4) 第一引数を「ByVal 0&」で渡すようにする。

《両方を変更する場合》
修正案5) 宣言側を ByVal lpRasDevInfo As Long にし、
         呼び出し側を「0」または「ByVal 0」で渡す。

他にも書き方はありますが、とりあえずはこのあたりですかね。

修正案1〜3は、あまり一般的ではない(と思う)ので、
個人的には、案4〜5 がおすすめです。


no-fly-bird  2005-01-20 19:12:15  No: 87873

構造体のサイズと第二.三引数を疑ってしました。
修正案4で解決しました。
たびたびありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加