独自アプリのAPI公開方法について

このQ&Aのポイント
  • Visutal C++ 2008(MFC)を用いてソフトウェアを開発しています。
  • ネットワーク通信系のソフトウェアを開発しており、EXE側とDLL側で通信関数を共有したいです。
  • API公開用のDLLを用意してEXEとDLLの両方でロードする方法以外にも良い方法はあるでしょうか?
回答を見る
  • ベストアンサー

独自アプリのAPI公開方法について

Visutal C++ 2008(MFC)を用いてソフトウェアを開発しています。 現在開発しているソフトウェアは、ネットワーク通信系のものであり、 EXE側で通信機能を実装し、DLLをプラグインという形でロードしています。 そこで、DLL側でもEXE側に実装した通信系の関数(SendやRecvなど)を 呼び出したい(EXEからAPIを公開?)と考えているのですが、 どう実装したらいいのか分かりません。 今のところは、API公開用のDLLを用意し、EXEとDLLから両方ともにロード をさせようかと思っていますが、他に良い方法は無いでしょうか? 宜しくお願いします。

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

  • ベストアンサー
回答No.1

普通はEXE側に実装した関数を公開するという作り方はしません。 一番よく使われる手法は、通信機能を抽象クラス化し、抽象クラスを継承したクラスをDLL側に実装しExportするというのが一般的と思われます。 DLLをロードライブラリし、DLL側に抽象クラスを継承したクラスの実体を生成する決まった名前の関数を実装します。 (戻り値は抽象クラスのポインタ) 抽象クラスにメッセージ受信時のメソッドや、メッセージを送信するための関数を用意すれば後は、DLL側に実装したクラス側で実際の処理を記述すれば良いのみとなります。 どうしても分からなければ、ご連絡頂ければサンプルを作ってみたいと思います。

sho1get
質問者

お礼

なるほど。よく分かりました。 実際にEXE側で抽象クラスをを作成して、DLL側で継承クラスを作成 していたので、あとはメッセージの送受信を抽象クラスに用意すれば 良いのですね。 モヤモヤが解けた感じでスッキリしました。 どうもありがとうございました。

関連するQ&A

  • js api

    javascriptにおいてapiと関数同じ物なのでしょうか? 以下引用 APIとは、アプリケーションプログラムインターフェイスの略語で、プログラミングの際に使用できる命令や規約、関数等の集合の事を指す。 ソフトウェア開発の際、いちから全てを作るより、APIを利用すればもともとあるプログラムを呼び出して、その機能を組み込んだソフトウェアを開発することができる。 APIの中に関数が含まれているという事でしょうか?

  • エンジンとAPIの違いとは?

    エンジンとAPIの違いは何かと聞かれたのですが,具体的に分かりません。 APIは,ソフトウェアを開発する際に使用する関数の集まりのことだと思うんですけど・・・。 どうか解答お願いします。

  • マイクロソフトが主要製品のAPI公開について

    皆様こんばんは。開発初心者です。 昨日、「マイクロソフトが主要製品のAPIを公開」という記事で、 この事により、ソフトウェアメーカの技術は飛躍的に向上する、 といった事が書かれていましたが、これからはどうなっていくと 予想されますでしょうか? 識者の方々のご意見をお伺い致したく、簡単で結構ですので、 ご教授お願い致します。

  • MFCとWIN32API

    はじめまして、コンピューターを勉強し始めた学生です。最近OSについての基本的な勉強を始めたのですが、ちょっとAPIのところで分らなくなりました。MicrosoftのWIN32とMFCは全くの別物なんですか?どちらもWindowsのSoftware開発に関わりが在りそうだとは思っているのですが... 何かとんでもない間違った質問をしている様な気もするのですが、誰か知っている人教えてください。

  • APIを多用した場合のメモリー消費について

    標準モジュール内でAPIを使用した関数を多数定義した場合、このプログラムを実行中はメモリーに常駐し、メモリーを消費(浪費)してしまうのでしょうか? それとも、その関数を呼び出した時のみロードされるのでしょうか? DLLという名前からして後者だと思うのですが。 よろしくお願いします。

  • bind()を呼び出さなくてもよい理由

    開発言語:C soccket(AF_INET, SOCK_DGRAM, 0)での通信時 サーバ側ではrecv()を行なうためにはbind()しますが、 クライアント側では、send()を行なうために明示的にbind()を行なわずにプログラムが動作しています。 この動作理由を教えて頂けませんか。 また、クライアント側において送受信を行なう場合にはsend()を呼び出した後に、 recv()を呼び出す場合にはbind()を必要としないプログラムを見た事あるのですが、 その動作理由が分かりません。 これについても合わせて教えて頂けると助かります。 よろしくお願いします。

  • winsockでファイル転送

    教えてください。 windockを使いファイルをサーバ側からクライアント側に転送したいのですが、テキストファイルfgetsで一行ずつ読み込んで、それをsendで転送し、クライアントでrecvで読み取り、テキストファイルに書き出す。 という一連の流れより、もっと簡単に、ファイルを転送する方法又はMFCの関数等ありますか? [環境] visual C++ 6.0 MFC

  • VC++2010 TCPIP通信の受信処理について

    VC++2010 TCPIP通信の受信処理について質問させていただきました。 現在、VC++2010 MFCのダイアログ でアプリケーションを作成しています。 現在、TCPIP通信で、受信処理のプログラムの所になるんですが、 recv関数を使用してるんですが、この関数は相手側からメッセージが送信される・切断される の イベントが発生しないとrecv関数は終了しません。 ここで質問なんですが、この関数でタイムアウト時間を設けたいのですが どのようにしたら良いかわかりませんでしたので質問させていただきました。 よろしくお願いします。

  • SDIアプリ内からもう一つSDIを作成する方法

    開発環境:WindowsXPSp3 + VC++2010 SDIの単純なアプリケーションと、スタティックリンクしているDLL(拡張DLL)があります。 exeのツールバーにあるボタンをクリックすると、DLL内にあるCreateNewWindowという関数を呼ぶようになっています。 このCreateNewWindowでは以下のようなコードが書かれています。 ------------------------------------------------------------------ CSingleDocTemplate* g_pNewWnd ; // グローバル void WINAPI CreateNewWindow() {   if( NULL == g_pNewWnd ) {     g_pNewWnd = new CSingleDocTemplate(       IDR_NEWWINDOW,       RUNTIME_CLASS( CSDIWndDoc ),       RUNTIME_CLASS( CSDIWndFrame ),       RUNTIME_CLASS( CSDIWndView )     );     CDocument* pDocumanet = g_pNewWnd->OpenDocumentFile( NULL ) ;   } } ※初期化や破棄処理は適宜行っているものとします。 ------------------------------------------------------------------ このように、Exeのほうに1つのSDIが存在している状態で、さらにDLL内で別のSDIのウィンドウを作成することは許されるのでしょうか? 実行すると、一応、ウィンドウは作成されるのですが、これらのフレーム内でCMFCToolBarを作成すると、DLLのこの関数でSDIを作成した時点でexe側のツールバーがおかしくなります。 具体的にはDLLのリソースにあるツールバーがexeのツールバーとして不完全な状態で反映され、DLLで作ったSDIウィンドウでは、ツールバーの領域だけ確保されてなにも無い状態です。 この関数を実行するまではexeのツールバーは正常に表示・動作しています。もちろん、リソースIDがユニークになているのは確認済みです。 やりたいことは、SDIやダイアログなどからボタンを押したら動的にSDIのウィンドウを生成して提供するDLLを作成したいのです。 参考になるサイトや書籍、アドバイスを頂けませんでしょうか。 よろしくお願いします。

  • TCP ロスがひどい時の対応

    Win32 C++ でTCP通信をさせています。 パケロスがひどい場合、connectに時間が掛かったり、 接続後send,recv待ちで切断エラーになることが多いようなのですが、 リトライをするにも切断エラーなどを判断するまでに10秒ほどかかったりするのを早く判断して、 sendし直し、またはconnectし直すにはどのように実装すれば可能でしょうか? よろしく御願いします。