- ベストアンサー
DLL(VC++で作った)で稼動中の計算の進捗状況をVBで知りたいのですが。
もともとCで計算していたものを,DLLにしました。 VBから普通に呼び出せるようにまでできるようになったのですが, できれば,結果だけでなく計算の進捗状況・途中結果なども知りたい思うようになりした。 どのようにすれば,このような機能を実装できるのでしょうか? ちょっとした計算に使うためにプログラムを書く程度なので, プログラミングやOSの仕様などはよくわからないのですが, VBで受け取れるイベントのようなものをDLLから送出したりできるのかなぁ? なんて考えて探してみたのですが,やはりよく分かりません。 VB側では結果を待機するループのようなものは回したくないので, イベントとして受け取れればなぁ~と思ったのですが。 説明がへたくそ&PCやプログラミングに詳しくないため 質問の真意が伝わりにくかったかもしれませんが, どんな些細なことでも結構ですので,解決法をご教授ください。 どうぞよろしくおねがいします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、honiyonです。 方法は2つあります。 1.進捗を伝える関数を用意する。 2.進捗報告用のコールバック関数(機能)を用意する。 2は色々と難しいのですが、1は簡単に出来ると思います。 進捗報告関数は、今現在の計算具合を判断し、その結果を返します。 この関数をし、VBから一定時間ごとにその関数を呼び出す事で進捗具合を知ることが出来ます。 簡単な説明ですが参考になれば幸いです(..
その他の回答 (5)
- mkii
- ベストアンサー率40% (43/105)
DLLではなくActiveXとして作れば、イベントを送り出せますよ。
- arata
- ベストアンサー率49% (139/279)
今回は、VBでとのこと、がんばってください。 参考までに、下記のURL(「猫でもわかるプログラミ ング」)のWindows SDK編72章に(DLLでやっていませ んが)プログレスバーを出す例がありますので、 ご参考までに。
- arata
- ベストアンサー率49% (139/279)
具体的に、やり方は説明できないのですが、UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。 あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。 なんのたしにもなりませんね。 ごめんなさい。
お礼
ご回答ありがとうございます。 >UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。 >あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。 そうだったんですか…。知りませんでした。 確かに,使う立場からしたらありがたい機能ですね。 でも,DLLでユーザインターフェースを提供するのって, なんだか難しそうですよね(笑) ちなみに,僕はコンソールアプリしか作ったことがないので, 計算はC,ユーザインターフェースはVBという安易な発想になってしまいました。 いずれは,「自分でプログレスバーを表示するDLL」にも挑戦してみようと思います。 どうもありがとうございました。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 私の紹介した2の方法を実現するには、ポインタや関数について熟知している必要があります。 また、1から全部説明すると結構な量になるのでおおまかに説明します。 因みに、ここで紹介する方法は VBで出来るか分かりません(^^; コールバック関数というのは、VBでいうイベントのようなものにあたります。 では、コールバック関数機能(?)を実装するかというと、 1.コールバック関数のポインタを取得する。 2.任意のタイミングで、取得したポインタを使ってコールバック関数を呼ぶ 以上です。 たったこれだけなのですが、実際にやろうとすると結構大変です。(ポインタ周りで) 別件ですが、大事な事を忘れていました。 #1の、1の方法にしろ2の方法にしろ、itohさんの仰るように非同期処理が必要になります。 これを実現するために、一般的には「マルチスレッド」というものを用います。 これもまた簡単そうでコールバック以上に難しい技術です。 計算処理を行いつつ、平行して進捗処理も行うために必要になります。 またかなりおおまかな回答ですが(^^;、参考になれば幸いです(..
お礼
再びのご回答ありがとうございます。 一度ならず,二度までも… 本当に感謝しております。 >私の紹介した2の方法を実現するには、… 「コールバック関数」というのは自分で作るのですね。 僕は計算用にコンソールアプリしか作ったことがないのですが, WIN32-SDKとかを少しかじったときにCALLBACKというような キーワードがあったように記憶していて, 「なにやら難しいもの」「SDKやMFCをやらなけりゃ縁のないもの」と 勝手に(笑)思い込んでおりました。 コールバックというのは, 「VB(上司)が進捗を管理する部署(コールバック関数)を設置し, 仕事を部下(DLL)に渡す際, その部署への連絡先(コールバック関数のポインタ)を指示する」 というイメージでよろしいでしょうか? まだ実際に試していないので定かではありませんが, 最近のバージョンではVBでも関数のポインタを渡せるようになったそうです。 では,さっそく実際につくってみようと思います。 ほんとうに,どうもありがとうございました。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >VBから普通に呼び出せるようにまでできるようになったのですが これは、DLL内の関数を呼び出すと言うことですよね? このDLL内の関数は、非同期で実行できるのでしょうか? 普通にと言われているところを見ると、例えば、ファイル入力関数のInput関数の ように、入力が完了するまで関数が戻ってこないのですよね。 まず、非同期に実行できるようにDLL内の関数を作り替えなければなりません。 これは、マルチスレッドとかマルチプロセスと言われている作りにしなければ いけないと言うことです。 その次に、計算途中でVBプログラムにメッセージを投げなければいけません。 VBプログラムでは、このメッセージを受け取ってイベントを発生させます。 このあたりの解説は、MSDNライブラリーの「非同期通知イベントの提供」を 参照してください。
お礼
ご回答ありがとうございます。 >MSDNライブラリーの「非同期通知イベントの提供」を参照してください。 「非同期」といういうキーワードがどんぴしゃりだったのですね。 系がVB-DLLではなかったですが,良いサンプルがのっていました。 どうもありがとうございました。 いずれ処理の分散化?並列化?を考えていたため, 実は既にスレッドをたてて計算しています。 プロセス間通信という言葉を聞いたことがあったので, マルチスレッド・マルチプロセスのところをいろいろ調べていたのですが, 調べ方が足りなかったようですね。いやはや。
お礼
早速のご回答ありがとうございます。 >1.進捗を伝える関数を用意する。 ですが,これは 「VB側(上司)から一定時間ごとにDLL側(部下)に進み具合を聞きに行く」 というイメージでよろしいでしょうか? もしできることならば 「ある程度作業が進むたびにDLL(部下)がVB(上司)に進捗を報告する」 というようなイメージにしたいのですが…。 DLLがVBにイベントを送出できたらなぁ~という発想です。 >2.進捗報告用のコールバック関数(機能)を用意する。 ですが,ご想像の通り難しくて分かりません(笑) でも,もしかしてこれが,ぼくがやりたいと思っていることなのでしょうか? もしそうでしたら,よろしければアドバイス頂きたいのですが。 よろしくおねがいします。