- ベストアンサー
TCP/IP通信OCXのアウトラインを教えてください)
Cの知識はありますが、 Windows開発は今回がはじめてです。 VC++6.0でTPC/IP通信を行うOCXを作成し、 クライアント(VB6.0で作成)から呼び出そうとしています。 TCP/IP通信のc/sサンプルプログラムはいくつかみましたが、 その機能をOCXの形にしたいときどう考えたらよいか アウトラインを教えていただけないでしょうか? わたしなりには以下のように考えました。 通信用のクラスを作成し、 メンバ変数(private)として ・サーバIP ・ポート番号 ・ソケットハンドル などを用意。 メッソッドとして ・接続(ソケット初期化~接続まで) ・送受信(ループ処理?) ・切断(シャットダウン~クリーンアップまで) イベントとして ・??? イベントとメソッドに何を用意すべきか (呼ぶべき関数と手順はわかるのですが、 メソッドとすべき単位がわかりません)と OCXから非同期モード設定関数(WSAAsyncSelect()) をよぶときの第2パラメタ(HWND)に 何をセットすべきかがわかりません。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>スレッドを使うのが一番よい(というか王道)でしょうか。 新規に作成する場合、非同期と同期、どちらが作りやすいかというと同期ですね。 また、スレッドを作る作らないだと、微妙なところです。 >もしウィンドウプロシージャでメッセージを受け取ろうとする場合、 >OCXでCOleControlから継承されたハンドルを使うとなると >COleControlのウィンドウプロシージャをいじらなければならないことになり >結局わたしのやろうとしていることは無理なんでしょうか・・・? >メッセージマップという技は使えないかとも考えたんですが、 >クラスウィザードでC++が勝手にうめこんでくれるような個所を >ちょっといじるとすぐコンパイルエラーに悩まされまして・・・ あえて何でOCXを作ってるかは確認しなかったのですが、MFCで作ってるということでいいのですか? で、任意のメッセージに対するメッセージマップの追加は ちゃんと方法が用意されています。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfcnotes_tn006.asp
その他の回答 (6)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>WSAAsyncSelectにわたすパラメータには >hWndはあってもコールバック関数名を指定していないのに、 >どうやって(どこで)拾えばよいのでしょうか。 ここに対する回答がちょっと抜けてましたね。 ウィンドウは、ウィンドウプロシージャと呼ばれるシステムからコールバックされる関数を必ずどこかに持っています。(誰が定義したか、どこにあるかということは関係なく)。 なので、WSAAsyncSelectはウィンドウハンドルを指定されるだけでコールバックすることができるのです。 あとは、他のさまざまなウィンドウメッセージと同じ方法で処理することで情報を取得することができます。
補足
影響範囲を抜きにして考えても スレッドを使うのが一番よい(というか王道)でしょうか。 ちなみに、勉強のために知っておきたいのですが、 もしウィンドウプロシージャでメッセージを受け取ろうとする場合、 OCXでCOleControlから継承されたハンドルを使うとなると COleControlのウィンドウプロシージャをいじらなければならないことになり 結局わたしのやろうとしていることは無理なんでしょうか・・・? メッセージマップという技は使えないかとも考えたんですが、 クラスウィザードでC++が勝手にうめこんでくれるような個所を ちょっといじるとすぐコンパイルエラーに悩まされまして・・・
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あくまでも案ですが。 >その通信部分をスレッド生成はやめてTCP/IPソケット通信に変えたいのです。 スレッドをやめる必要性は?そのスレッド中で同期でTCP/IP通信をするのが 一番簡単かと。 これならインターフェイスで修正が必要な箇所はサーバ名、ポート番号等の ソケット通信固有の情報のみですよね。 >#2さんのご意見ですと、OCX自身がメッセージをうけとるように設定できるようですが、 >そのメッセージを受け取るコールバック関数を >どうやって定義したらよいのかが実はわかっていません。 CやC++で、Windowsアプリでウィンドウを作成したことはありますか? 要は自分で作ったウィンドウなら何でもいいんです。 受け取るメッセージIDも、自由に使っていい範囲の値なら 何を使ってもかまいません。 ただ、折角スレッド生成されているのでしたら、非同期ではなく同期のほうが楽ですよ。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>OCXからWinsockコントロールを利用することは >可能でしょうか? もちろん可能です。 また、COMは包含や委譲による継承をサポートしています。 ただ、わざわざ使いづらいWinsockコントロールを使ってOCXを作成するメリットはないですねぇ。 >既にあるVC++6.0で作成済みのOCXの >通信部分をTCP/IP通信に変更したいのです。 こういうことですと、新たにプロパティ、メソッドの構成を考えること自体がナンセンスでは? VB側からは従来と同じようなインターフェイスで利用可能なのが理想ですよね。オブジェクト指向ですと。
補足
Windowsプログラミングのセオリーがわかっていない状態で 読みづらい点や見当違いなことをいうかもしれませんがアドバイスお願いします↓↓ VBとのインタフェースはもちろん変えたくありません。 従来はOCXのあるメソッドがよばれると、送受信スレッドが生成され ウィンドウメッセージとコールバックの機能をつかってサーバと通信し 処理終了後にVB側にイベント通知していました。 その通信部分をスレッド生成はやめてTCP/IPソケット通信に変えたいのです。 ご紹介いただいたwinsockコントロールMSDNの説明を読みましたが、 connect完了やsend完了ごとにコントロールを配置した側にイベントがあがってきて それをうけてどうするかを(VB側で)記述するようなのですが、 そうではなく、いままで通りOCX内ですべてをすませてしまいたいのです。 #2さんのご意見ですと、OCX自身がメッセージをうけとるように設定できるようですが、 そのメッセージを受け取るコールバック関数を どうやって定義したらよいのかが実はわかっていません。 WSAAsyncSelectにわたすパラメータには hWndはあってもコールバック関数名を指定していないのに、 どうやって(どこで)拾えばよいのでしょうか。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あんまり夢も希望もない回答ですが(^^; >VC++6.0でTPC/IP通信を行うOCXを作成し、 >クライアント(VB6.0で作成)から呼び出そうとしています。 VBにWinsockコントロールというのが付属しています。 なので、OCXを自作するのであれば、これより高機能でないと意味がないような・・・ #確かにこのコントロールは、同期通信ができないってことで辛いんですけどね。 それでも勉強のために作るのであればですが、 >イベントとメソッドに何を用意すべきか >(呼ぶべき関数と手順はわかるのですが、 >メソッドとすべき単位がわかりません)と Winsockコントロールがいい見本になるかと(^^;;; >OCXから非同期モード設定関数(WSAAsyncSelect()) >をよぶときの第2パラメタ(HWND)に >何をセットすべきかがわかりません。 OCX中で非表示ウィンドウを作成し、そのウィンドウハンドルを指定することになります。
補足
正確には、OCXを新規に作るのではなく 既にあるVC++6.0で作成済みのOCXの 通信部分をTCP/IP通信に変更したいのです。 OCXからWinsockコントロールを利用することは 可能でしょうか? そのようなコードを見たことないのですが・・・。
さくっとMSDN見ただけですが、 説明には、 メッセージを受け取るウィンドウを識別するハンドル。 と書かれていますので、 OCXとして機能を搭載していくのであれば、 OCXのウィンドウハンドルを渡します。 この場合、たぶんCOleContorolのハンドルになると思うので(普通のウィンドウでもそうですが) this->m_hWnd でいけると思いますがいかがでしょうか? 試してみてください。
- kaha
- ベストアンサー率23% (41/177)
TPC/IP通信やOCXの作り方は知りませんが、TPC/IPのコンポーネントなら商品として発売されています。(トライアル版もあります。) 市販の商品を購入して作成したほうが納期短縮、品質向上になると思います。 また、市販のコンポーネントがどんなものか知っておくのも良いかと。
お礼
コンパイルエラーは MESSAGE_HANDLER でやろうとしていたせいでした。 OCXでつくる理由は、VBの開発とOCXの開発で作業をわけており、今回はOCX側の改造のみ(できれば)で対応したいからです。 ありがとうございました。