wininet.dllのInternetOpenの同期、非同期について

このQ&Aのポイント
  • VBAでFTPの転送をする際に、InternetOpenを使うのですが同期させたいと思います。dwFlagsの指定の仕方について質問です。
  • dwFlagsに0が指定された場合は、同期すると考えて宜しいでしょうか?
  • dwFlagsに、文字列でINTERNET_FLAG_ASYNCを指定すると非同期となるということでよいでしょうか?
回答を見る
  • ベストアンサー

wininet.dllのInternetOpenの同期、非同期について

wininet.dllのInternetOpenの同期、非同期について お世話になります。 VBAでFTPの転送をする際に、InternetOpenを使うのですが同期させたいと思います。 以下サイトなどでいろいろ調べたのですがdwFlagsの指定の仕方について質問です。 1.dwFlags に 0 が指定された場合は、同期すると考えて宜しいでしょうか? 2.dwFlags に、文字列で INTERNET_FLAG_ASYNC を指定すると非同期となるということでよいでしょうか? 3.複数を組合せの時はどのように記述しますか? 以上、宜しくお願い致します。 <参考サイト> http://www.red.oit-net.jp/tatsuya/vb/WinInet.htm#InternetOpen ●参考サイトより抜粋 Public Declare Function InternetOpen Lib "Wininet.DLL" Alias "InternetOpenA" _ (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, _ ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long dwFlags : オプション。以下のパラメータの組み合わせを指定します。 INTERNET_FLAG_ASYNC サーバーから取得する(非同期)。 INTERNET_FLAG_FROM_CACHE キャッシュから取得する。 INTERNET_FLAG_OFFLINE INTERNET_FLAG_FROM_CACHEと同じ。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

VBは範疇ではない(使ったことない)のですが… >InternetOpenを使うのですが同期させたいと思います。 この同期について、どういう理解です? クライアントにあるファイルとサーバにあるファイルが同一になるように。 とかいう意味でしたら、そこは自分でそのように処理する必要がありますが…。 >1.dwFlags に 0 が指定された場合は、同期すると考えて宜しいでしょうか? 指定なし…なのでそうなるでしょう。 # ここで言う同期とは…「結果が得られるまで関数コールから戻らない。」という意味の同期かと… >2.dwFlags に、文字列で INTERNET_FLAG_ASYNC を指定すると非同期となるということでよいでしょうか? まず、「文字列」ではありませんのでご注意を。 定数です。 値については…ヘッダファイルを参照するなりして下さい。 # というか、掲示されたページの最初の方で設定していますよね。[標準モジュール]ってところで… INTERNET_FLAG_ASYNCだと、0x10000000です。(VB的には&H10000000) # 結果はイベントなどで通知…ということになるかと思われます。 # InternetSetStatusCallback()で設定したコールバックが呼ばれる…っぽい。 >3.複数を組合せの時はどのように記述しますか? 論理和で指定します。 API呼び出しではよくあること…ですが……

tony77
質問者

お礼

参考になりました!ありがとうございました!

関連するQ&A

  • WinInet.dll で HTTPS へ POST できません

     WinInet.dll を使って、HTTPS サーバーへデータを POST するプログラムを作っています。開発言語は VB6 です。  HttpSendRequest で 12029 エラーとなり原因が分かりません。  HTTP 通信テストツールの RESTTEST を使ったテストでは正常に終了しています(HTTPステータス 200 が返っている)ので、回線やインターネット設定(ファイヤーウォールの問題など)は問題ないと思われます。  ソースから手続きの部分だけ抜き出して、下記に示します。  (エラーチェックなどはソース上にはありますが、ここでは省いています)  手続き上何か抜けが無いかご指摘いただけると助かります。   'インターネットサービスをオープンする   lngWinINet = InternetOpen(vbNullString, _                INTERNET_OPEN_TYPE_PRECONFIG, _                vbNullString, _                vbNullString, _                0)   'HTTPサーバへ接続   lngHttpHnd = InternetConnect(lngWinINet, _                  "www.test.jp", _                  INTERNET_DEFAULT_HTTPS_PORT, _                  vbNullString, _                  vbNullString, _                  INTERNET_SERVICE_HTTP, _                  0, _                  0)   'リクエストを初期化   Dim tmpURL As String * 255   Dim lngSecFlag As Long   lngSecFlag = INTERNET_FLAG_SECURE Or _          INTERNET_FLAG_IGNORE_CERT_CN_INVALID Or _          INTERNET_FLAG_IGNORE_CERT_DATE_INVALID   tmpURL = "/testdir/test.php"   lngReqHnd = HttpOpenRequest(lngHttpHnd, _                 "POST", _                 tmpURL, _                 "HTTP/1.1", _                 vbNullString, _                 0, _                 INTERNET_FLAG_RELOAD Or lngSecFlag, _                 0)   'リクエストを送信   Dim strHeader As String   Dim strPostData As String   strHeader = "Content-Type: application/x-www-form-urlencoded"   strPostData = "TEST1=aaa&TEST2=bbbbb"   Call HttpSendRequest(lngReqHnd, _              strHeader, _              Len(strHeader), _              strPostData, _              Len(strPostData))  手続き部分は、順番も含めて上記の通りです。  これ以外のことはやっていません。  これ以外にやっておかなければいけないことや、上記のやり方ではよくない部分などありましたら、ご教授いただけると助かります。  よろしくお願いします。

  • VB2005 から DLL を呼び出す

    VB 初心者です。 今、VB の練習ということで VB 2005 Express Edition を使って、個人用ブラウザをつくっています。Web ページの表示は Webbrowser コンポーネントを使っています。 その仕様で、閲覧先によって HTTP Proxy を変更するようになっています。(自分で決めたんですが) いろいろ調べてみると、urlmon.dll の UrlMkSetSessionOption() を呼べば自分のアプリケーション限定で Proxy を変更できるようだ、ということがわかりました。 古い VB など(VB 6 とか?)では、 Private Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" _ (ByVal dwOption As Long, ByVal pBuffer As Any, _ ByVal dwBufferLength As Long, _ ByVal dwReserved As Long) このような感じで宣言するとかあったんですが、VB2005 では Any がダメだとか、 Type INTERNET_PROXY_INFO Dim dwAccessType As Long Dim lpszProxy As String Dim lpszProxyBypass As String End Type で Type はダメだとか、呼び出し側で、LenB を使おうとしたら使えないだとか、INTERNET_OPTION_PROXY の値がわからないなど、問題が山積みです。 上記 DLL を VB 2005 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • API FtpPutFileの戻り値

    お世話になっております。 API FtpPutFileを使用しているのですが 確実にFalseになります。一日悩みましたが原因が わかりません。 If FtpPutFile(lngConnect, _ "***.txt", _ "***.txt", _ FTP_TRANSFER_TYPE_ASCII, _ 0&) <> False Then です。必要なものを付け加えておきます。 Private Declare Function FtpPutFile Lib "wininet.dll" _ Alias "FtpPutFileA" _ (ByVal hFtpSession As Long, _ ByRef lpszLocalFile As String, _ ByRef lpszNewRemoteFile As String, _ ByVal dwFlags As Long, _ ByVal dwContext As Long) As Long Private Const FTP_TRANSFER_TYPE_ASCII = &H1& です。環境はWinXP,VB6+SP5 よろしくお願い致します。

  • 「Active X Inet」と「WinInet.dll」の違いについて

    最近「VB6」から「VB 2008 Express Edition」へプログラミング環境を 移行したものです。 VB6では「Active X コントロール:インターネットトランスファ(Inet)の OpenURLメソッド」を使用してHTTPファイルを取得していました。 環境の移行を機に「Windows Internet(WinInet.dll)の機能」を使用して、 VB6の「Inet.OpenURLメソッド」と同様の処理を行おうと考えました。 しかしいざ実行すると、「Inet.OpenURL」だと正常にファイルを取得できるのに、 「WinInet.dll」では異常終了してしまうケースがあります。 私の経験不足から、その原因を突き止めることができません。 よろしくお願いいたします。 ◎HTTPファイルを取得するまでの WinInet.dll で行っている処理[1] (1) InternetOpen ↓ (2) InternetConnect ↓ (3) HttpOpenRequest ↓ (4) HttpSendRequest ↓ (5) HttpQueryInfo ↓ (6) InternetReadFile ◎HTTPファイルを取得するまでの WinInet.dll で行っている処理[2] (1) InternetOpen ↓ (2) InternetOpenUrl ↓ (3) HttpQueryInfo ↓ (4) InternetReadFile ◎ 上記、処理[1]で正常にファイルが取得できるURL 上記、処理[1]では失敗するが処理[2]で正常にファイルが取得できるURL 上記、処理[1]でも処理[2]でも失敗するが、「Inet.OpenURL」で正常に ファイルが取得でいるURLの、3通りのURLが存在します。 この差はどこから生じるのでしょう。 処理[1]、処理[2]で失敗する場合は、 「InternetConnect」、「HttpSendRequest」または、「InternetOpenUrl」で 異常終了し、「エラーコード:2(ERROR_FILE_NOT_FOUND: The system cannot find the file specified.)」が返ってきます。 「ファイルが見つからない」というのは、「該当のURLが存在しない」と いう事なのかもしれませんが、「Inet.OpenURL」で、正常にファイルが 取得できるのは腑に落ちないです。 「Inet.OpenURL」自体も「WinInet.dll」の機能を使って実現している様な事を 聞きました。いったい、何が違うのでしょう。 何方か、私のこの疑問を解消して頂けないでしょうか? よろしくお願いいたします。

  • VBAでDLLが見つからないエラー

    CADのVBA(6.0)ですが、DLLが見つからないエラーが出ます ' こっちはエラーが出ない Public Declare Function SearchVBApath Lib _ "C:\Program Files\AppliTool\VB\DDDD.dll" (ByVal env As String, ByVal s As String) As Integer 'こっちだとエラーが出る Public Declare Function SearchVBApath Lib "DDDD.dll" (ByVal env As String, ByVal s As String)    As Integer VBAプロジェクトファイルとDLLは同じフォルダにおいてあります 上記のようにフルパスだとエラーが出ないのですがDLL名だけだとこの関数のところでエラーがでます このDLL関数宣言行の前の方には他のDLL関数も同じようにパス省略で記述しているのですがそちらにはエラーが出ません どなたかヒント下さい、よろしくお願いします。

  • VB.NETでUnzip32.DLLを使うには?

    VB2005または2008でUnzip32を使ってzipファイルを解凍する方法を教えてください。 Unzip32のバージョンは5.42、OSはXP32bitSP3です。 UnZipGetVersionではきちんとバージョンが返ってきますので、DLL自体には問題はないと思います。 Classの下に Public Declare Function UnZip Lib "unzip32.dll" (ByVal hwnd As Long, ByVal szCmdLine As String, ByVal szOutput As String, ByVal dwSize As Long) As Long を記述し、 UnZip(0, "-o C:\01.zip E:\", vbNull, 0) と命令してもコンパイラエラーになってしまいます。 第二引数のC:\01.zipはちゃんと存在するファイルであることを一応書き添えておきます。 引数の記述がおかしいと思うのですが、Unzip32のドキュメントを読んでも解決できません。 一日中ぐぐってもVB2005以降での構文サンプルも見つかりませんでした。 UnzioExtractでも引数の説明が意味不明で解凍できませんでした。 できましたら第一から第四までの引数になにを入れたらいいのか、 具体的に指示していけたらありがたいです。 よろしくお願いします。

  • vc++のAPI(dll)の引数をVBAでうけとる

    Excelで開発しなければならない事情があり、 vc++のAPIが持っている関数を ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。 VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。 VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。 VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。 --VC-- XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL); --VBA-- <宣言部> Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long <呼び出し部> Dim lngHandle As Long Dim sName as String Dim lngType As Long Dim sValue As String Dim lngSize as Long Dim tmpSize as Long lngSize = 0 sName = "keiyaku" tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString) XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString degug.print sValue

  • WinInetのInternetOpenUrl関数が正常に動作しない。

    ネットワーク上のHTMLソースを取得しようとしています。InternetOpenUrl関数が動作せず、常にNULLが返ってきます。 環境は、WindowsXP、WindowsCE Platform Builder です。 void Get_HTML(){ HINTERNET hInternet; HINTERNET hFile; char Buff[1000]; DWORD ReadSize; BOOL bResult; //WinInetの初期化 char *agent ="WININET Sample Program"; hInternet = InternetOpen( (LPCWSTR)agent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 ); if( hInternet == NULL ){ printf("InternetOpen Error \n"); } //ネット接続チェック if( InternetAttemptConnect(0) != ERROR_SUCCESS { printf("インターネットに接続できません。\n"); } else{ printf("インターネットに接続できる\n"); } //URLオープン char open_url="http://www.sample.com/sam1.html"; hFile = InternetOpenUrl( hInternet, (LPCWSTR)open_url, NULL, 0, INTERNET_FLAG_RELOAD, 0 ); printf("%s",(LPCWSTR)open_url); if( hFile == NULL ){ printf(" InternetOpenUrl ERROR \n"); } } InternetOpenUrl関数の戻り値がNULLになりReadを することが出来ません。 解決方法よろしくお願い致します。

  • wininetでPOSTで値を渡せません

    winnetを使ってPOST形式でサーバにパラメータを渡そうとしていますが、パラメータが渡せずに困っています。 HttpOpenRequestかHttpSendRequestがおかしいと思うのですが、自分では見当がつきません。 よければ何処に問題があるのか教えてください。 環境:vc++2005 int DoHttpRequest( void ) { HINTERNET hInet, hSession, hRequest; DWORD dwTotal = 0; wchar_t param[] = L"type=1"; wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded"; wchar_t accept[] = L"Accept: */*"; // 使ってない BOOL flag; Console::WriteLine( "Http接続START" ); //インターネット(WinInet)初期化 hInet = InternetOpen( NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hInet == NULL) { Console::WriteLine( "エラー1" ); return -1; } // サーバへ接続 hSession = InternetConnect( hInet, L"192.168.11.25", 9999, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 ); if( hSession == NULL ) { Console::WriteLine( "エラー2" ); InternetCloseHandle(hInet); return -1; } //HTTPセッションの開始, 指定のURLオープン hRequest = HttpOpenRequest( hSession, L"POST", L"/sample/service.php", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0 ); if (hRequest == NULL) { Console::WriteLine( "エラー3" ); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } // 送信 flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param )); if( flag == FALSE ) { Console::WriteLine( "エラー4" ); InternetCloseHandle(hRequest); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } //インターネットハンドルの解放 InternetCloseHandle( hRequest ); InternetCloseHandle( hSession ); InternetCloseHandle( hInet ); Console::WriteLine( "Http接続END" ); return 0; }

  • GetNextWindowがDLLファイルUser32.dll内に見つかりません。

    前のウィンドウのハンドルを取得したいのですが上記のタイトルにあるエラーメッセージが出ます。 VB6 XPproでやってます。 User32.dllはsystem32フォルダーの中にあるのですが。 Private Declare Function GetNextWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal wCmd As Long) As Long sub tes() n=GetNextWindow(me.whnd,3) end sub