こんにちは。充と申します。
早速で申し訳ありませんが
私の力ではどうすることもできない現象がありまして・・・。
現在、私はRAS接続をVBで行おうとしています。
手始めに電話帳エントリを表示しようと
以下のコマンドを書きました。
lngRet = RasEnumEntries(vbNullString, vbNullString, 0, lngBuffer, lngEntry)
しかし、lngEntryの戻り値は0
lngRetの戻り値は632。
632のエラーコードを調べたところ・・・
構造体のサイズが間違っています。
内部エラーが発生しました。コンピュータを再起動して、エラーが発生する前に行った作成の変更がすべて有効になっていることを確認してください。エラーが解消しない場合は、Windows 2000 のイベント ログで詳細な警告またはエラーを調べてください。
何度か再起動してみたのですが
何ら状況に変化はありません。
イベントログを確認しても
特にエラーは発生しておりません。
もうこれ以上は
私の手におえないため、こうして質問させて頂きました。
どなたか同じような現象が発生した方
もしくは上記エラーを御存知の方がいらっしゃいましたら
お力添えをお願いします。
英語ですが・・・
参考まで・・・
http://www.vbapihelpline.de/ref/funca.php4?Func=RasEnumEntries&Letter=r
http://home.iprimus.com.au/billmcc/PlatformVB/dun/rasenumentries.htm
以上。
試せる環境がないので、参考ページにあるプログラムを見ての返答です。
http://www.microsoft.com/JAPAN/developer/library/jpntwkpf/_ras_rasenumentries.htm
ここに引数の説明があるので参考にしてください。
簡単に説明すると
第一引数 予約 Nullを設定
第二引数 PhoneBook(.pbk) のフルパスの入った文字列(Null文字で終わる)
へのポインタ。Win2000でNullを指定すると全て取得、Win9xでは無視
第三引数 RASENTRYNAME構造体配列へのポインタ
第四引数 RASENTRYNAME構造体配列のバイト数
第五引数 (戻り値)取得したエントリ数が入ってくる
となっています。ですので
API関数の宣言は、
Private Declare Function RasEnumEntries Lib "RasApi32.DLL" Alias "RasEnumEntriesA" (ByVal Reserved As Long, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
とし、
Private Type RASENTRYNAME9X
dwSize As Long
szEntryName(RAS_MAXENTRYNAME) As Byte
End Type
Private Type RASENTRYNAMENT
dwSize As Long
szEntryName(RAS_MAXENTRYNAME) As Byte
dwFlags As Long
szPhonebookPath As String * 257
End Type
Dim Entry9x(255) As RASENTRYNAME9X
Dim EntryNT(255) As RASENTRYNAMENT
Dim EntryCount As Long,i As Long
Entries(0).dwSize = 264
EntryNT(0).dwSize = 264
'Win9x
lngRet = RasEnumEntries(0,vbNullString,Entry9x(0),Entry9x(0).dwSize * 255,EntoryCount)
'Win2000
lngRet = RasEnumEntries(0,vbNullString,EntryNT(0),EntryNT(0).dwSize * 255,EntoryCount)
としてください
すんません岡田さん
上の一つ目のやつは英語ではなくドイツ語ですが。
わからないところが余計わからなくなって...(^^;
皆様、大変お世話になります。
(k.kさん、前回はありがとうございました)
環境等を説明するのを忘れていました。
OS:windows2000
VB:5.0(ただし、接続できたら.NETにする予定です)
k.kさんからのアドバイスを参考に
修正を行ってみましたが無理でした・・・。
RasEnumEntriesの第二引数に
アドレス帳のフルパスを直接記入しても
エントリが取得できません。
岡田さんに勧められたページを拝見しましたが
特に引数はおかしくないように思えます。
環境や、設定の問題なのでしょうか?
> 632のエラーコードを調べたところ・・・
> 構造体のサイズが間違っています。
RASENTRYNAMEのdwSizeメンバに、構造体サイズを指定するのを
忘れているのだと思います。もしくは、指定した値が間違っているとか。
> 修正を行ってみましたが無理でした・・・。
修正後も、戻り値が 632 のままなのでしょうか?
自分も何年か前に同じ事で悩んでいた覚えがあります。
その時に動いたコードを抜粋しておきます。
動作させる環境がないのでテストはしてませんが...
参考までに
その時の問題は、魔界の仮面弁士さんの書き込みにあるように
「dwSizeメンバに、構造体サイズを指定するサイズが
いくつになるか」でした。
'------ 以下、ソースコード
Option Explicit
Public Declare Function RasEnumEntries_Win2000 Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal reserved As Long, ByVal lpszPhonebook As String, lpRasEntryName As typeRASENTRYNAME_WIN2000, lpcb As Long, lpcEntries As Long) As Long
Public Const MAX_PATH = 260
Public Const RAS95_MaxEntryName = 256
Public Const RASBASE = 600&
Public Const ERROR_BUFFER_TOO_SMALL = (RASBASE + 3&)
Public Type typeRASENTRYNAME_WIN2000
dwSize As Long
szEntryName(0 To RAS95_MaxEntryName) As Byte
bytPadding1(0 To 2) As Byte
dwFlags As Long
szPhonebookPath(0 To MAX_PATH) As Byte
bytPadding2(0 To 2) As Byte
End Type
' - - - - - - - - - - - - -
Public SubFunc()
Dim lRet As Long ' 戻り値
Dim tRasBuffer() As typeRASENTRYNAME_WIN2000 ' RASエントリ名称構造体
Dim lBufferSize As Long ' RASエントリ名称エリアの取得バッファサイズ
Dim lRasEntries As Long ' RASエントリ名称の取得数
' 電話帳から電話番号名称を取得する
ReDim tRasBuffer(0)
lSize = LenB(tRasBuffer(0)) ' 電話番号名称構造体のサイズをとりあえず1つにする
tRasBuffer(0).dwSize = lSize ' 構造体サイズを設定する
lRet = RasEnumEntries_Win2000(0&, vbNullString, tRasBuffer(0), lBufferSize, lRasEntries)
If lRet = 0& Then
' 電話帳から正常に取得
ElseIf lRet = ERROR_BUFFER_TOO_SMALL Then
' 電話帳に複数の電話番号が登録されている
Debug.Print "登録数 = " & CStr(lRasEntries)
ReDim tRasBuffer(0 To lRasEntries - 1&) ' 電話番号名称構造体のサイズを変更
tRasBuffer(0).dwSize = lSize ' 構造体サイズを設定する
lRet = RasEnumEntries_Win2000(0&, vbNullString, tRasBuffer(0), lBufferSize, lRasEntries)
If lRet = 0 Then
' 電話帳から正常に取得
Else
' 取得エラー
Debug.Print "エラー = " & CStr(lRet)
End If
Else
' 取得エラー
Debug.Print "エラー = " & CStr(lRet)
End If
End Sub
とりあえず動作確認が取れたコードを乗せておきます。
Private Declare Function RasEnumEntries Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal Reserved As Long, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Sub RasHangUp Lib "rasapi32.dll" Alias "RasHangUpA" (ByVal hRasConn As Long)
Private Const RAS_MaxEntryName = 256
Private Const RAS_MaxDeviceName = 128
Private Const RAS_MaxDeviceType = 16
Private Const RAS_MaxPhoneNumber = 128
Private Const RAS_MaxCallbackNumber = 128
Private Const UNLEN = 256
Private Const PWLEN = 256
Private Const DNLEN = 15
Private Const ERROR_INVALID_HANDLE = 6
Private Type RASENTRYNAME9X
dwSize As Long
szEntryName(RAS_MaxEntryName) As Byte
End Type
Private Type RASENTRYNAMENT
dwSize As Long
szEntryName(RAS_MaxEntryName) As Byte
dwFlags As Long
szPhonebookPath As String * 257
End Type
Private Type RASDIALPARAMSA
dwSize As Long
szEntryName(RAS_MaxEntryName) As Byte
szPhoneNumber(RAS_MaxPhoneNumber) As Byte
szCallbackNumber(RAS_MaxCallbackNumber) As Byte
szUserName(UNLEN) As Byte
szPassword(PWLEN) As Byte
szDomain(DNLEN) As Byte
dwSubEntry As Long
dwCallbackId As Long
End Type
Private Sub Form_Load()
Dim EntryNT(255) As RASENTRYNAMENT
Dim ParamNT(255) As RASDIALPARAMSA
Dim EntryCount As Long, i As Long
Dim TmpConName As String
Dim hConn As Long
Entry9x(0).dwSize = 264
EntryNT(0).dwSize = 264
lngRet = RasEnumEntries(0, vbNullString, EntryNT(0), EntryNT(0).dwSize * 255, 0)
'こっから下は確認してませんネットで調べて予想で書いてます。
CopyMemory ParamNT(0).szEntryName(0), EntryNT(0).szEntryName(0)
rc = RasDial(0, 0, ParamNT(0), -1, 0, hConn)
If rc <> 0 Then
MsgBox "接続エラー"
RasHangUp hConn
End If
End Sub
本当に皆様ありがとうございます。
心から感謝します!
まずは、uchiさんのソースを使わせて頂くと
RasEnumEntriesの戻り値が0になりました!
ちゃんと、lRasEntriesに
件数が入るようになりました!
ただ・・・
tRasBuffer(0).szEntryNameで名前が取れないのです・・・。
これは私の理解力が弱いせいだと思います。
k.kさんに教えて頂いたソースと一緒に
明日にでも考えてみたいと思います。
ひとまず、戻り値が0になった報告でした。
> tRasBuffer(0).szEntryNameで名前が取れないのです・・・。
ここに入ってくる文字列は、シフトJISコードのはずです。
VBの StrConv関数を使用して、Unicodeに直してみで下さい。
こんな感じです。
sWk = StrConv(tRasBuffer(0).szEntryName, vbUnicode)
uchiさん、ありがとうございました!
無事に名前を取得することができ
接続することもできました!
皆様に感謝感謝です!
ところで、非常にあつかましいのですが
接続後に、ファイルの転送等を行いたいのですが
RAS接続後にVBでファイルの転送って可能なのでしょうか?
(新規質問のがいいのかもしれませんが・・・)
調べるとソフトは色々あるんですが
VBで行えるのか不安です。
自分なりにももう少し調べてみようと思いますが
可能かどうかだけでも教えて頂けたら嬉しいです。
> RAS接続後にVBでファイルの転送って可能なのでしょうか?
RAS接続した後、FTPを使ってファイルのダウンロード/アップ
ロードを行えます。
FTPの操作は INETコントロールを使うと簡単そうですね。
自分がやった時は、INETコントロールの存在を知らなかったの
でAPIコールしてました。
FTP VB などをキーにネットを検索するといくつかのサイトが
見つかりました。
また、RAS接続を行った後は、ネットワークコンピュータとして
見ることができませんでしたか?(記憶にありません...)
見えるのなら、共有フォルダにアクセスしてファイルの転送を行う
こともできますね。(こっちは、やったことありません)
uchiさん、いつもありがとうございます!
FTPを行おうと思うのですが
どーにも難しいです・・・。
WinInet.dllでできるようなことが書いてますが
片方のパソコンをサーバーにしないといけない風で・・・。
私としてはクライアント対クライアントで
専用線でRAS接続してファイルをPUTだけできればいいのですが・・・。
> FTPを行おうと思うのですが
> 私としてはクライアント対クライアントで
> 専用線でRAS接続してファイルをPUTだけできればいいのですが・・・。
FTPを使うのでれば、クライアント/サーバの関係でなければ
いけません。RAS接続される側のPCにファイルをアップロード
(PUT)したいだけなのであれば、そちらをFTPサーバにすれば
良いような気がします。
それとも、RAS接続される側のPCで接続されたか監視して、接続された
ら、こちらからもアップロードをしたいと言うことなんでしょうか?
RASはリモートアクセスサーバの略でこの名前からもわかるように、
C/Sでなければなりません。
FTPでファイルをアップロードするためには、FTPサーバを立ち上げなければなりませんし。
クライアント対クライアントで接続したいのでしたら、詳しくないですが、
DirectXを使用したP2P(ピアツーピア)の接続方法が一番手っ取り早いらしいです。
皆様ありがとうございます。
そして、お手数をおかけします。
クライアントにFTPサーバを立ちあげて
なんとかPUTすることに成功致しました。
これもすべて皆様のおかげです。
FTPの方法をあれこれ調べたのですが
やはりBASP21が簡単でしたので
BASP21でPUTに成功しました。
これでやっと本番環境の構築ができます。
(これからが地獄なんですけど・・・)
皆様にはほんとに感謝感謝感謝です。
今後ともよろしくお願い致します。
ツイート | ![]() |