C++ (Visual Studio 6.0) で書かれたデータ取得プログラムがあります。一部のクライアントは、独自のカスタム ソフトウェアまたは LabView からソフトウェアを制御したいと考えています。配布できる dll を使用した単純な API を考え出し、開始方法に関するヒントをいくつか提供したいと考えています。これは非常に基本的なもので、おそらく 4 つまたは 5 つのコマンドです。私の DAQ プログラムは、同じマシンの独自のウィンドウで引き続き実行されます。別のプログラムから制御できるように設定したいと思います。
6 に答える
あなたは DLL で正しい軌道に乗っています。本当の秘訣は、どのような種類のプロセス間通信 (IPC) を使用するかを決定することのようです。オプションは、ソケット、パイプ、共有メモリ、同期オブジェクト (イベントなど)、ファイル、レジストリなどです。
それを決定したら、実行可能ファイル内にリスナーを実装して、DLL を使用しているソフトウェアからの着信 IPC メッセージを待機します。
API に関する限り、必要に応じてシンプルに保つことができます。DLL に 4 つまたは 5 つの関数を公開させ (モジュール境界の問題を回避するために、char* や long などのネイティブ データ型のみを使用するようにしてください)、それらは IPC メカニズムを使用して実行中のアプリと通信します。
COMの大きな利点は、DLLが必要ないことです。アプリケーションは常に実行されているとあなたは言います。これは、COMオブジェクトの作成者(「ローカルサーバー」)として機能できることを意味します。
代わりに「stdcall
」DLLが必要な場合は、すべての呼び出しをCOMインターフェイスに内部的に転送するDLLを提供できます。それを書くのはとても簡単でしょう。あなたは5つの機能しか持っていないとあなたは言います。これは、これら5つのメソッドを持つ1つのCOMインターフェイスがあることを示しています。ラッパーDLLがロードされると、EXEにCOMオブジェクトの作成を要求します。次に、DLLは5つのstdcallメソッドを公開し、各メソッドはCOMオブジェクトの1つのメソッドを呼び出します。
このように単純に始めたものは、時間の経過とともに成長する傾向があるため、前もってもう少し作業を行い、成長するテクニックを使用することをお勧めします。
プログラムに COM インターフェースを実装すると、クライアントはそれとのインターフェースを自由に選択できるようになります。また、COM はそのすべてをユーザーから隠すように設計されているため、IPC などの仕組みについて心配する必要はありません。
将来的には、COM は、必要に応じて、スクリプト言語で十分にサポートされているイベントなどの慣用句をすでに明確に定義しています。
更新: COM を実装する方法はたくさんあります。優れた COM ブックのガイドを使用して最初のプリンシパルから構築するか、ATL のようなフレームワークを使用してボイラー プレートの一部を節約することができます。多くの優れたサンプルがあります。たとえば、MSDNを参照してください。
dll を使用できます。私はそれを検討します。しかし、できれば RESTful な単純な http ベースの API を作成することも検討したいと思います。
メリット:移植しやすい。任意の言語から簡単にクライアント アプリを作成できます。ネットワーク経由で作業できます。テストが容易になります (スクリプト言語またはブラウザーを使用します)。
短所: パフォーマンスが遅くなります。C++ でセットアップするための大幅な配管作業。LabView が http 呼び出しを行うことができるかどうかはわかりません。
何かのようなもの:
http://xxx/data [GET、おそらくテスト用に POST]
http://xxx/data/stop [投稿]
あなたの要件を考えると、少しやり過ぎかもしれませんが、そうではないかもしれません。私が取り組んできた多くのアプリは移植する必要があり、より高速な開発言語を使用してテストおよび拡張できれば、より迅速に拡張できたはずです。
LabVIEW は DLL の呼び出しをサポートしていますが、これは LabVIEW 開発における弱点の 1 つです。正しく行わないと、アプリケーションがクラッシュしやすくなる可能性があります。LabVIEW 開発者として、私は HTTP サービスを作成するという MattyT の提案を気に入っています。TCP/IP ポートを作成できるすべてのプラットフォーム上のすべての言語が、そのポートにアクセスできます。フルボア HTTP の代わりに独自のカスタム TCP/IP プロトコルを使用できると思いますが、いずれにしても互換性の問題は解決されます。
DLL を使用する場合は、次のヒントを参考にしてください。関数呼び出しの引数リストでは、構造体または構造体へのポインターを使用しないでください。LabVIEWに戻されるDLLにメモリを割り当てないでください。LabVIEWにはメモリ管理が組み込まれており、他のものとうまく動作しません。これは、Java などのメモリ管理機能を持つ他の言語にも当てはまる場合があります。メモリを割り当ててポインタを DLL に渡すと、LabVIEW はより適切に動作します。ポインター、配列、文字列は可能な限り避けてください。LabVIEW はこれらを DLL に渡すことができますが、これは高度なトピックであり、LabVIEW 開発者が C も知っている場合に最適に機能します。
ここに関連する質問があります。私は LabView 固有のものに行き着きたくありません.LabView は stdcall を使用すると dll にアクセスできるようです。このような dll は、VB または他の Windows ソフトウェアからも呼び出すことができます。これは、私が狙っているものです。
COM インターフェイスにアクセスする機能についてはよくわかりませんが、私のアプリケーションでどのように見えるかについて、もう少し詳しく教えていただければ幸いです。