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

APIの使用法(RasAPI32.dll)

  • 題名: APIの使用法(RasAPI32.dll)
  • 著者: tina
  • 日時: 2003/07/10 14:04:51
  • ID: 141
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
分類:[全般]

ダイアルアップのAPI RasApi32.dllを使用するため、
以下のように 構造体 および DllImportを定義したのですが、

RasEnumDevicesの戻り値が
632 : 構造体のサイズエラー
が帰ってきます。

何が悪いのか見当がつかないので、
どなたかご教授ください。
よろしくお願いします。

<以下 vb.net ソース抜粋>
Public Const RAS_MAXDEVICETYPE As Integer = 16
Public Const RAS_MAXDEVICENAME As Integer = 128
'RAS デバイスの情報
'typedef struct tagRASDEVINFO {
' DWORD dwSize;
' TCHAR szDeviceType[ RAS_MaxDeviceType + 1 ];
' TCHAR szDeviceName[ RAS_MaxDeviceName + 1 ];
'} RASDEVINFO;
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure SRasDevInfo
Dim dwSize As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MAXDEVICETYPE)> _
Dim szDeviceType As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MAXDEVICENAME)> _
Dim szDeviceName As String
End Structure

Class CRas

<中略>

'利用可能なすべての RAS 対応デバイスの名前と種類を返します。
'DWORD RasEnumDevices(
' LPRASDEVINFO lpRasDevInfo, // RAS デバイスの情報を受け取るバッファ
' LPDWORD lpcb, // バッファのサイズ(バイト数)
' LPDWORD lpcDevices // バッファに書き込まれたエントリ数を受け取る変数
');
<DllImport("rasapi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function RasEnumDevices( _
ByRef lpRasDevInfo As SRasDevInfo(), _
ByRef lpcb As Integer, _
ByRef lpcDevices As Integer) As Integer
End Function

<中略>

Public Function GetDevises() As SRasDevInfo()
Dim rdiRet As SRasDevInfo()
Dim intDevInfoSize As Integer
Dim intCount As Integer
Dim intSize As Integer
Dim i As Integer
Dim intRet As Integer

ReDim rdiRet(0)
intCount = 1
intDevInfoSize = Marshal.SizeOf(rdiRet(0))

intSize = intDevInfoSize * intCount
rdiRet(0).dwSize = intDevInfoSize
intRet = RasEnumDevices(rdiRet, intSize, intCount)

If intRet = RASERROR.ERROR_BUFFER_TOO_SMALL Then
'バッファをリサイズしてリトライ
ReDim rdiRet(intCount)
rdiRet(0).dwSize = intDevInfoSize
intSize = intDevInfoSize * intCount
intRet = RasEnumDevices(rdiRet, intSize, intCount)
Else

End If

Return rdiRet
End Function
end Class
この記事は投稿者に削除されました
  • 題名: Re[2]: APIの使用法(RasAPI32.dll)
  • 著者: tina
  • 日時: 2003/07/23 13:57:14
  • ID: 207
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
どうやらAPIの呼び方が間違ってたみたいでした。
とりあえず自己解決しましたので報告します。

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Class CRasDevInfo
Public dwSize As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MAXDEVICETYPE + 1)> _
Public szDeviceType As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MAXDEVICENAME + 1)> _
Public szDeviceName As String
End Class

Public Class CRas
Public Declare Auto Function RasEnumDevices Lib "rasapi32.dll" ( _
ByVal lpRasDevInfo As IntPtr, _
ByRef lpcb As Integer, _
ByRef lpcDevices As Integer) As Integer

Public Shared Function GetDevices() As CRasDevInfo()
Dim intRet As Integer
Dim lpcb As Integer
Dim lpcDevices As Integer
Dim devinfo As IntPtr
Dim rdiRet As CRasDevInfo()
Dim i As Integer

'必要サイズ取得
CRas.RasEnumDevices(IntPtr.Zero, lpcb, lpcDevices)
devinfo = Marshal.AllocHGlobal(lpcb)

'一個作って構造体のサイズ設定
ReDim rdiRet(0)
rdiRet(0) = New CRasDevInfo()
Marshal.WriteInt32(devinfo, Marshal.SizeOf(rdiRet(0)))

'データ取得
intRet = CRas.RasEnumDevices(devinfo, lpcb, lpcDevices)
If intRet = 0 Then
ReDim rdiRet(lpcDevices - 1)
For i = 0 To lpcDevices - 1
rdiRet(i) = New CRasDevInfo()
Marshal.PtrToStructure(devinfo, rdiRet(i))

'ポインタのシーク
devinfo = IntPtr.op_Explicit(devinfo.ToInt32() + Marshal.SizeOf(rdiRet(i)))
Next
Marshal.FreeHGlobal(devinfo)
Return rdiRet
Else
Throw New RasException(intRet)
Return Nothing
End If
End Function
End Class
解決済み!

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