NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

Windowsメッセージによるプロセス間通信

よろしくお願いいたします。
 
LabVIEWで作成したアプリケーションとVC++で作成したアプリケーションを一つのPC内で並列に実行させ、
2つのアプリケーション間で通信させ、指令やデータのやり取りを行いたいと思っています。
通信の方法としては、WindowsOSのメッセージを使用したいのですが、
LabVIEWにおいて、OSのメッセージを扱う方法が分りません。
ご存知の方がいらっしゃいましたら、ご教授お願いいたします。
 
●以下、やりたいことの詳細です。
VC++で親プロセスとなるランチャー画面を持つアプリを作成済みです。
親プロセスから呼び出されて起動する、子プロセスの一つをLabVIEWで作成しようと思っています。
親プロセスは「SendMessage()」というWindowsAPIで子プロセスに指令を送るという仕様なので、
子プロセスは親プロセスからのメッセージを受け取る機能が不可欠です。
また、親プロセスにメッセージを送る機能も必要です。
サポートの方からは、DataSocketという機能を提案していただいたのですが、
既に作成済みの親プロセスの仕様は変更したくないという状況です。
メッセージ1/6
16,681件の閲覧回数

LabVIEW側で操作したい動作をVC++で記述してDLL化します。

それをLAbVIEWのCall Library Function Nodeで呼び出して、動くようにしましょう。

 

VC++(親プロセス) ←→ VC++で作ったDLL(子プロセス) ←→ LabVIEWのCall Library Function Node

 

という具合です。

 

メッセージ2/6
16,657件の閲覧回数
平素よりNI製品をご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ技術部の幾田と申します。
 
小澤様、適切なご指示ありがとうございます。
 
このようにプログラム同志の通信、制御、データの共有に関してLabVIEWでは幾つかの機能を持っておりますのでご紹介したいかと思います。
 
1.作成したプログラムがLabVIEW同志であった場合

同時に実行される複数のVI間でデータをやり取りするにはグローバル変数を使用します。
 
 
2.LabVIEWから他のプログラミング環境で作成されたEXEのコードを呼び出す場合

ブロックダイアグラム上にて右クリック>>全関数>>上級>>コードインターフェイスノードを使用します。
こちらによってC言語のようなテキストベースのプログラミング言語で書かれたコードを、ブロックダイアグラムから直接呼び出すことができます。
 
「コードインタフェースノード(Code Interface Node)」を使用しないで、直接DLLまたは共有ライブラリを呼び出す場合、小澤様のご教授通りブロックダイアグラム上にて右クリック>>全関数>>上級>>「ライブラリ関数呼び出しノード(Call Library Function Node)」を使用します。
このノードでは、さまざまなデータタイプや関数の呼び出し規約がサポートされています。
このノードを使用して、大部分の標準ライブラリやカスタムDLLおよび共有ライブラリにある関数を呼び出すことができます。
 

今回のお問い合わせにてやはりコードインターフェイスノードやライブラリ関数呼び出しノードを使用するのが最適かと思われます。
 
上記にてご紹介させていただきました関数の詳細などはヘルプをご参照いただければと思います。
 
また、サンプルなどご利用の際は以下のリンク先よりご利用いただけますのでご参照いただければと思います。

最後に捕捉といたしましてDataSocketですが、Webまたはローカルコンピュータにて他のVIや弊社のMeasurement Studioなどのアプリケーションとデータを共有する場合に使用します。
 
 
 
 
メッセージ3/6
16,643件の閲覧回数
こんにちは。佐山です。

結論から言うとウインドウメッセージを使った
イベントプロシージャをLabVIEWでは書けません。
でもってSendMessage(API)で送出されるメッセージはウインドウに送られるので、
ウインドウを持たないDLLが受け取ることは出来ない、ということになります。

ですのでCall Library Function NodeでPeekMessage(API)を呼び出すか、
別の方法で通信をする形になります。
(PeekMessageでのメッセージ取得は動作未確認です。
 LabVIEW側で万が一不要なメッセージを破棄するような場合は、
 WM_USER以降のウインドウメッセージを送信してもPeekできない可能性があります)

送り側がどのようなメッセージを送出するのか不明ですが、
LabVIEWが自身のウインドウハンドルを取得するには、
アプリケーションの情報からタイトルバーに表示されるウインドウ名を取得し、
それをFindWindow(API)に渡すことで取得できます。

逆送信ですがCall Library Function NodeでSendMessage(API)を呼び出します。

とここまで書いておいてなんですが、
UDPの方がらくだと思います。

親プロセスの形式をここだけかえると不統一になる、
というご意見は最もかと思いますが、
ソケット通信などローカルでやり取りのできる別の手段の方がLabVIEWには適してます。

万が一の逃げ道(今回のような例外を想定して)を、
別の通信方法で親プロセスに残す、という考え方もあります。

(Call Library Function NodeはLabVIEWだけで出来ないことをやるための最後の切り札だと私は考えています。)

できればサンプルで確認したかったのですが、
私情でなんとも時間が無くて、
こんな適当なレスだけで申し訳ないです。

以上ご参考になれば幸いです。
メッセージ4/6
16,607件の閲覧回数

「SendMessage(API)で送出されるメッセージはウインドウに送られるので」

なるほど。ここまで考えていませんでした。確かにウィンドウがないですねー。

いつも最小化している隠し(?)ウィンドウを置いといて、やり取りを行なうという方法はどうでしょう?

 

0 件の賞賛
メッセージ5/6
16,598件の閲覧回数

asaiです。

小澤様、幾田様、佐山様、 お返事ありがとうございます。

とても参考になりました。

検討した結果、「Call Library Function Node」を使用させていただこうと考えています。

まずは、お礼まで。

0 件の賞賛
メッセージ6/6
16,522件の閲覧回数