VB初心者なのですが、
VB6.0 Win2000の環境において、APIでRasGetEntryDialParams, RasSetEntryDialParamsを使用してダイアルアップ情報の取得、変更を試みてますが
(できえば、発信番号の取得及び変更)構造体のサイズが異なるのかうまくいきません???
質問が分かりづらいかもしれませんが、アドバイスをよろしくお願いします。
既に、ご存知とは思いますが、RASAPI関数を使用する場合、Windows Platform によって構造体サイズが異なることがありますので、
1.現在使用されている関数、構造体、定数の宣言
2.うまくいかない内容とそれが再現される最小限のコード
3.API関数の戻り値
などを載せると、回答が得られるかもしれません。
loan-birdさんお返事ありがとうございます。
>1.現在使用されている関数、構造体、定数の宣言
>2.うまくいかない内容とそれが再現される最小限のコード
コードはVisual Basic StationというサイトにRasの特集(RASエントリプロパティ取得設定)が記載されていたのでそこのコードとほぼ同じです。
関数RasGetEntryPropertiesを使用しており、構造体のサイズはサイトを見てもらった方がよいかと思います。
>3.API関数の戻り値
戻り値が632 構造体のサイズが間違っていますと出ています。
もともと、WinNTの仕様のためなのかうまくいかないのかもしれませんが、
よろしければ、ご返答よろしくお願いします。
> コードは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)
# の意味になってしまうかな。
>> 1.現在使用されている関数、構造体、定数の宣言
>> 2.うまくいかない内容とそれが再現される最小限のコード
> コードはVisual Basic StationというサイトにRasの特集(RASエントリプロパティ取得設定)が記載されていたのでそこのコードとほぼ同じです。
> 関数RasGetEntryPropertiesを使用しており、構造体のサイズはサイトを見てもらった方がよいかと思います。
問題点を絞り込んで整理した方が、回答が得られ易いと思って書いたんですが....
私に限っては、VBStationさんのサンプルを解析するつもりはありません。
昔、VBStationさんのサンプルを拝見した時の記憶では、構造体メンバのフィールド長を指定する定数(RAS_MaxEntryName等)や構造体を、Win95系とNT系で使い分けしている様ですが、RAS.Hでは、Windowsのバージョン(WINVER)で振り分けている。
と、いう違いがあったと思います。
> もともと、WinNTの仕様のためなのかうまくいかないのかもしれませんが
RAS.Hが正しいと思うので、Win2000の場合も、VBStationさんのサンプルにある
Win95用の定数や構造体を使用してみては如何ですか?
魔界の仮面弁士さん、loan-birdさん
お返事ありがとうございました。ご指摘のとおりでした。
解決しました。ありがとうございました。
解決後にすいません。
同サイトに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
たびたびすいません。よろしければ、ご返答を。
サンプルに対する質問なら、サンプルを書いた人にききましょう。
自分で書いたコードなら、その書いたコードを提示しましょう。
断片的な質問では、断片的な回答しかできませんよ。
> Public Const RAS_MaxDeviceType = 16&
それでも問題ありませんが、できれば、
Public Const RAS_MaxDeviceType As Long = 16&
のように、データ型も明示した方が良いですよ。
> 構造体のサイズが違うと。。。。
で。dwSizeには何を指定されているのでしょうか?
すいません。コードは以下のようになっています。サイトの方にも質問してみます。
[モジュール]
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
うーむ。貼り付けて、すぐに試せるコードになっていませんね……。
断片的なコードを載せるなら、せめて、
どの行で、どんなエラーが出ているのかも書きましょう。
> 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 がおすすめです。
構造体のサイズと第二.三引数を疑ってしました。
修正案4で解決しました。
たびたびありがとうございました。
ツイート | ![]() |