VB6で作成した別々のアプリケーションが存在し、
アプリ1でコマンドボタンを押下したタイミングで
アプリ1のLabel1.Captionをアプリ2に通知したいのですが、
VB6のActiveXコントロールを作成し、
そのActiveXコントロールをアプリ2に貼り付けて、
上記機能を実装したいと思っております。
ActiveXコントロールを作成したことがないため、
ヘルプとにらめっこしているのですがいまいち理解できていません。
そもそも上記のような機能をActiveXを使用し、
実現できるものなのでしょうか?
下記のようにとりあえず簡単に作成してみたのですが、
[ActiveXコントロール]
Option Explicit
Event AP1Click(ByVal lblCap As String)
[アプリ2]
Option Explicit
Private Sub ActiveXコントロール1_AP1Click(ByVal lblCap As String)
Label1.Caption = lblCap
End Sub
アプリ1側の処理と、アプリ2のActiveXコントロール1_AP1Clickイベントを
呼ぶ方法(おこす方法?)がいまいちよくわかりません。
ご教授願いませんでしょうか?
その程度なら ActiveX 化せずとも、DDE でも十分では無いでしょうか。
(1) VB6 を 2つ起動し、「標準 EXE」のプロジェクトを新規作成します。
(2) 一方のプロジェクト名を『Sender』、他方を『Receiver』にします。
(3) 双方の Form1 に、ラベル Label1 を貼り付けます。
(4) Receiver の Form1 の LinkMode プロパティを「1 - ソース」にします。
(5) Receiverプロジェクトを、[F5]キーで実行しておきます。コードは一切不要です。
(6) Sender の Form1 には、さらにボタン(Command1)も貼り、後述のコードを書きます。
(7) Sender プロジェクトを [F5]キーで実行して Command1 を押すと、ラベルの内容が
実行中の Receiver 側の Form1.Label1 に送られます。
'--- Sender の Form1 ---
Option Explicit
Private Sub Form_Load()
'送信したいデータ
Label1.Caption = FormatDateTime(Now, vbLongTime)
End Sub
Private Sub Command1_Click()
Label1.LinkMode = vbLinkNone
Label1.LinkTopic = "Receiver|Form1"
Label1.LinkItem = "Label1"
Label1.LinkMode = LinkModeConstants.vbLinkManual
Label1.LinkPoke
Label1.LinkMode = vbLinkNone
End Sub
魔界の仮面弁士様
アドバイスありがとうございます。
私もActiveXの作成経験が皆無だったため、
他の手法を検討していたのですが、
汎用性を考え(他言語アプリ間との連携など)、
ActiveX化したいというのが上の希望であり、
そのように考えております。
私はDDEではなくUDPを提案したのですがあえなく却下されまして^^;
ActiveX コントロールは、プロセス間通信の機能を持っているわけでは
無いと思いますので、どちらにせよ、通信部分は別途作りこむ必要があるかと。
> ActiveX化したいというのが上の希望であり、
希望は「ActiveX コントロール化」ではなく、「ActiveX 化」なのですか?
ActiveX EXE で良いのであれば、ヘルプの『ActiveX EXE コンポーネントの作成手順』のあたりに、非同期通知処理のサンプルがありますよ。
魔界の仮面弁士様、度々有難うございます。
お恥ずかしい話なのですが、ActiveX ExeとActiveX コントロール、ActiveX Dllの違いがいまいち理解できておりません。
http://okwave.jp/qa491741.html
上記サイトに違いが記載されておりましたが、GUIがなければdllでいいという結果なのでしょうか。
今回の場合で行くと、あくまでCaption名だけが知りたいため、特にGUIは必要ありません。
なので、魔界の仮面弁士様のアドバイス通りActiveX EXEでいいのかもしれません。
ただ気になるのが、ActiveX EXEとして配布し、ocxのような形で配布先でも扱えるものなのでしょうか?
私なりに色々試して見たいと思いますが、宜しければ助言の程お願いします。
すみません、やはりわからないので再度質問させてください。
[ActiveXコントロール側]
Option Explicit
Public Event TestEvent(ByVal a As String)
Private Sub UserControl_Click()
RaiseEvent TestEvent("abc")
End Sub
[VBアプリ2側]
Option Explicit
Private Sub TestActiveX1_InCalled(ByVal a As String)
Label1.Caption = a
End Sub
とすると、VBアプリ2に貼り付けたユーザーコントロールをクリックすると、
Label1のCaptionにabcと表示されます。
これは、当然ユーザーコントール側のUserControl_Clickイベントで
TestEventをRaiseEventしているからなのですが、
このイベントをVBアプリ1のCommand1_Clickイベントで
TestEventをRaiseEventしたい場合はどのようにすればよろしいのでしょうか?
やはりActiveXコントロールを使用して作成したいです。
よろしくお願いします。
すみません。記述ミスです。
[VBアプリ2側]
Option Explicit
Private Sub TestActiveX1_TestEvent(ByVal a As String)
Label1.Caption = a
End Sub
> TestEventをRaiseEventしたい場合はどのようにすればよろしいのでしょうか?
こういう事ですか?
'=== コントロール側 ===
Public Sub Foo()
RaiseEvent TestEvent()
End Sub
'=== フォーム側 ===
Public Sub Command1_Click()
SampleControl1.Foo
End Sub
'=== 受信側 ===
Private WithEvents Hoge As SampleControl
Private Sub Hoge_TestEvent()
'……
End Sub
魔界の仮面弁士様、有難う御座います。
早速教えていただいたロジックを再現してみましたが、
受信側のHoge_TestEventイベントが起きません。
ほかに特別な設定があるのでしょうか。
'=== コントロール側 ===
Option Explicit
Event TestEvent()
Public Sub Foo()
RaiseEvent TestEvent()
End Sub
'=== フォーム側 ===
Option Explicit
Public Sub Command1_Click()
TestActiveX1.Foo
End Sub
'=== 受信側 ===
Option Explicit
Private WithEvents Hoge As TestActiveX
Private Sub Hoge_TestEvent()
Label1.Caption = "aaa"
End Sub
> 早速教えていただいたロジックを再現してみましたが、
> 受信側のHoge_TestEventイベントが起きません。
WithEvents 変数「Hoge」を、Nothing のままにしていませんか?
Hoge には、発生元オブジェクトのインスタンスを Set する必要があります。
ツイート | ![]() |