Archive
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
こんばんは!
念願のビデオカメラをゲットしたゆってぃです!

いやぁ、これであらゆるイベント事をガシガシ記録できますね!
これで結婚式の二次会で使うムービーもバッチリです。
結婚の予定は全くありませんが、、、(涙)


さて、今日はMFCプログラミングで、自分のアプリから別のアプリを呼び出す方法です。
これが出来ると、他人の作ったアプリを使って色々なことが出来るようになりますので
なんだか一気にレベルアップした気になります(笑)

MFCで別プロセスを起動させる手段は、大きく分けて3つあります。
system関数
ShellExecute関数
CreateProcess関数
です。

なお、system関数は標準Cライブラリの関数ですので、Windows以外のプラットフォームでも呼び出せます。
(ただし、実行可能かどうかは処理系によります)
非常にシンプルで使いやすいので、linux環境などで使用したことがある人も多いのではないでしょうか?

僕はよくShellExecute関数を使うので、今日はこの使用方法を説明します。
機能が拡張されたShellExecuteEx関数というのもありますが、今回はShellExecuteに焦点を当てて説明します。
あと、環境はWindows XP SP3(今時…)、Windows Visual Studio 2010 professional です。

さて、MSDNを見ると、インターフェースは


HINSTANCE ShellExecute(
HWND hwnd, // 親ウィンドウのハンドル
LPCTSTR lpVerb, // 操作
LPCTSTR lpFile, // 操作対象のファイル
LPCTSTR lpParameters, // 操作のパラメータ
LPCTSTR lpDirectory, // 既定のディレクトリ
INT nShowCmd // 表示状態
);


となっております。
それでは、それぞれの引数について書いていきます。

まず、hWndですが、ここには親ウィンドウハンドルを入れます。
ウィンドウハンドルを取得したい場合は、MFCなら(CWNDクラスの拡張クラスからであれば)GetSafeHwndで取得可能です。
ネイティブなWin32APIでゴリゴリ書くときはCreateWindow実行時に取得できますが、MFCではウィンドウはすでに存在しているものですからね(笑)
あ、自分自身が親ダイアログの場合はNULLで大丈夫です。

次のlpVerbは、これから実行するプロセスにどんな操作を行うかを、文字列として渡します。
今回は実行可能ファイルなので、_T("open")としましょう。

次のlpFileは、実行するファイル名を入れます。
なお、ここには実行ファイルのパスを文字列として入れますが、
lpDirectoryNULLを入れた場合は、絶対パスを。
特定のパスを入れた場合は、そこからの相対パスを文字列として入れます。

次のlpParametersは、実行ファイルに引数として渡す文字列です。
例えば、起動するプロセスがコンソールアプリケーションであった場合などは、コマンドライン引数を入れます。
これも文字列です。

次のlpDirectoryは前述の通りですね。
例えば、作成中のメインアプリと、そこから呼び出すサブプロセス(xxx.exeなど)が必ず同じディレクトリにあることが前提なら、ここに現在のディレクトリのパスを取得して入れれば便利です。

最後のnShowCmdには、アプリケーションの表示方法を指示するフラグを指定します。
詳細はMSDNをご参照ください。

関数が成功すると、32 より大きい値が返りますので、戻り値は必ず確認しましょう。

ちなみに、ShellExecute関数を実行すると、その終了を待たずに次へ進んでしまいます。
終了を待ちたい場合は、CreateProcess()を使用してプロセスのハンドルを取得し、WaitForSingleObject()と組み合わせて終了を待ちましょう。

さて!今日はここまでです!
(それにしても、最近、どんどん組み込みから遠ざかっていますね><)

以上、最後までお読みいただいて、ありがとうございました(感謝)
関連記事
スポンサーサイト
こんばんは!
帰宅したら、にゃんこ達がラグの上に盛大にお醤油をこぼしていて、ちょっとショッキングなゆってぃです。
洗って落ちるとかいう生ぬるいレベルの範囲ではなかったので、泣く泣く処分を決めました。

でもね、これは

テーブルの上に醤油を置いておいた僕がいけないんです。

ちゃんとフタは閉めてたのですが、にゃんこは何が起こすかわからないので…(涙)

まだ買って数ヶ月しか経ってないのになぁ(T_T)



さて、今日は昨日のVISAの続きです。
というほど書く内容もないのですが、大まかな使い方はわかりました。

基本的には
<接続> → <通信> → <接続終了>
という流れのようです。

それでは、さっそくひとつひとつ見ていきましょう。

<接続>
viOpenDefaultRM()関数でVISAシステムを起動し、viOpen()関数で接続を確立します。
この時、viOpen()の引数として、測定器を特定するためのアドレス情報などを渡します。
その後、viSetAttribute()関数で接続の属性を決めます。タイムアウトなどもここで設定します。


<通信>
接続が完了したら、viPrintf()関数で、測定器にコマンド(クエリ)を投げます。
文字列は通常のprintf()フォーマットで記述します。
これらのコマンドはSCPI(スキッピー)と呼ばれるコマンドセットに定義されており、測定器の機種に関係なく送ることが出来るコモン部分のコマンドと、機器別のコマンドに分かれています。
機種別のコマンドは、各測定機器のヘルプをご参照ください。

なお、SCPIに関する概要はwikipediaに書かれていますので、合わせてご参照ください。
SCPIとは(英語)
IEEE488(SCPIのみに関する説明ではないですが、日本語)

また、投げるコマンドの最後に"?"を付けた場合は、機器が該当するデータを応答として返します。
(※全てのコマンドに応答するわけではありません。?が付けられるコマンドを知るには、接続機種のヘルプをご覧下さい。)
例えば、ある測定値の最大値を知りたい場合などに用います。
なお、この応答を受け取る際には、viScanf()関数を使用します。
このフォーマットも、scanf()関数と同じですので、簡単に使用することが出来ます。

つまり、viScanf()を使用する前には、必ずviPrintf(io, "xxx?")のように、問い合わせを行う必要があります。
もし、応答がこない場合(正しい問い合わせコマンドが投げられていない場合)は、viSetAttribute()関数で指定した時間だけ待ち、その後はエラーとして先に進みます。

<接続終了>
通信が終わったら、viClose()関数を用いて、接続を解放することを忘れずに!

以上が、VISAライブラリを用いた測定器のリモートコントロール方法です。
実際に組んでいただければわかりますが、驚くほど簡単に、PCから測定器を操作することが出来ます。
ログ取りも簡単に出来るし、開発段階でも大いに役立ってくれそうです^^

最後までお読みいただいて、ありがとうございました!(感謝)
関連記事
こんばんは!
今夜は久々にブログ2連投のゆってぃです!
もう肩が痛いです(笑)

先日、電車に乗っていたら、隣にとても素敵な女の子が座りました。
これだけでも喜びでいっぱいになった単純なゆってぃですが
なんとその素敵な子が、私に全力でよりかかって来たのです!

まぁ、その子は居眠りしていただけなのですが、僕はとても幸せでした(馬鹿)

でも、いつの時代も幸せな時間は長く続かず…。

空気を読まない電車が急停車したはずみで、その子は起きてしまったのです。


素敵な子『あ…ごめんさない(照)』


ゆってぃ『いえ、かまいませんよ(キリ)』














席を移動されたんですけど…(涙)


実は、笑いを取るために、この話をライブのMCの時にも話しました。

どんずべりだったのは言うまでもありません(号泣)





さて


みなさん、VISAってご存知ですか?
いえ、カードではありません

VISAとは、『VXIplug&play System Alliance が開発した規格を実装したもので、測定器の通信用の標準ライブラリを定義』したものだそうです。
まぁ、これだけ読んでもさっぱりわかりません
要するに、測定器をリモートで動かすためのライブラリです。
具体的には、I/O制御部分のライブラリで、この関数群を使用すれば、測定器に簡単なコマンドを投げるだけで簡単に測定器の制御が出来ます。

工場での検査時などに、高級な測定器を用いることは多いと思います。
ですが、検査員さんが測定器を操作し、結果をひとつひとつ値を目視確認していては、効率が悪い上、人的ミスの発生率も上がりますよね。
そんなとき、例えばWindowsアプリのボタンをひとつ押すだけで自動で測定を開始し、OKやNGを自動で判断できたら、工数も減りますし、人的ミスの発生も抑制できます。
とても素敵ですね!

詳しい先輩に聞けば一瞬なのでしょうが…さわりぐらいは自分で勉強しようと思い、いろいろ調査中です。

インターフェースは非常にシンプルで、基本的に接続を確立したあとはviPrintf()で制御コマンドを投げるだけのようですね。
ライブラリの完全な理解までは時間がかかりそうですが、まとまった知識を得たら、またご紹介させて頂きたいと思います。

最後までお読みいただいて、ありがとうございました!(感謝)
関連記事
こんばんは!
最近、疲れのせいか一気に老け込んだゆってぃです。

さて、昨日はBLACK SHARKさんでのライブでした!
このライブハウス、PAさんが素晴らしくて、良い音を作り出してくださいました。
機会があったら、またここでライブをやりたいです。

さて、LOOF CROWN(バンド名)のやらせて頂いたセットリストは

1.Golyat(ゴリアテ)
2.ENGINE++(エンジン)
3.EVER(エヴァー)
4.Paprika(パプリカ)
5.Flower Seed(フラワー シード)

でした。
といっても、全てオリジナル曲なので
1曲もご存じないと思いますが(汗)

ここで、2曲目のENGINE++ですが
++ってまさか…
とお思いになるかもしれません。

そう、このブログをお読みの方なら、さぞ親しみ深いあろう
インクリメント演算子
です。

そうですよ。
1ずつ加算されるのです。
何かがね…(笑)

僕は、この++を通して
『ほんのわずかかもしれないけど、今日の自分は、昨日の自分よりも大きくなっている』
ということを、端的に表現したかったのです。

本当はライブのMCの時にこの事を話したかったのですが
メンバーの(猛)反対に合い話せずじまいでした。
ですから、ここで、このようにお話をさせていただいております(笑)

本当は別の曲もそれぞれ由来があるのですが、それはまた別の機会に^^

最後までお読みいただいて、ありがとうございました!!(感謝)
関連記事
こんばんは!
最近、バンドメンバー(特にベースとドラム)からの風当たりが強いゆってぃです。
あいつら、いつかまとめておみまいしてやらんといかんな。。。

さて、いよいよ今週の土曜日はライブです!
場所は早稲田のBLACK SHARKさん。
LOOF CROWN(ルーフ クラウン)」というバンドで、17:00からの出演です。
BLACK SHARKさん

チケット1500円 + ドリンク代500円

ですが

事前に連絡いただければ、チケット代はどうにでもなります(笑)

よければ見に来てくださいね!!
(どうでもいいけど、うちのバンドのHPにこのブログのリンクが貼られていないのはなぜじゃ…)


さてさて、今日はMFCでのメッセージの投げ方です。
完全に備忘録です。

通常、メッセージを投げる場合はPostMessage()か、SendMessage()を使用しますが、MFCではこれらの関数は自身のダイアログにしか投げることが出来ません。

しかしながら、親から子へメッセージを投げたい場合は多々あります。
例えば、WindowsからのWM_XXXのようなメッセージを親が受け取り、そのメッセージ(あるいは、それに順ずるメッセージ)を子に投げるケースです。

そんなときは、CWnd::SendMessageToDescendants()を使用します。
これはMFC用の関数で、指定された Windowsのメッセージをすべての子孫ウィンドウに送るために呼び出されます。
もちろん、ユーザー定義のメッセージを投げることも出来ます。
CWnd::SendMessageToDescendants


今回、タブコントロール用に作成した子ダイアログにWM_DEVICECHANGEメッセージを受信させたかったのですが、やり方がまずいのか、あるいはそーゆーものなのか、親ダイアログしかこのメッセージを受信しませんでした。
ですから、親ダイアログのOnDeviceChange()ハンドラ内で、子ダイアログにメッセージを横流しするという実装をしました。
これが正しいのかは不明ですが、とりあえず目的の動作は行えているのでよしとします(笑)
(ただ、明日もう一度よく動作を確認して、挙動がおかしければ追記します)

最後までお読みいただいて、ありがとうございました!(感謝)
関連記事
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。