- PR -

Vb.NetからVB6.0で作成したexeを起動したい

1
投稿者投稿内容
蘭子
会議室デビュー日: 2005/01/12
投稿数: 1
投稿日時: 2005-01-12 12:35
いつも参考にさせていただいてます蘭子と申します。
今回どうしても希望通りの動きにならないので投稿しました。

やりたいことは
@Visual Basic .NETのフォーム(以下フォームA)から
Visual Basic 6.0で作ったc:\Project1.exe(以下このメインフォームをフォームB)を起動
AフォームAをフォームBの親フォームとする(閉じるイベントや最小化最大化イベントの同期)
BフォームAからフォームBの表示位置やサイズの変更を行う
の3点です。(環境はWindows XP)

今のところ@起動は出来ました。
Aについては閉じるイベントについては出来たのですが(Aフォームを閉じればBフォームも閉じる)
リサイズなどのイベントがうまくいきません(Aフォームを小さくしたらBフォームがはみ出したりする)。
同じくBについてもフォームBのexeの初期表示の位置に表示されます。

以下がソース(一部抜粋)です。


フォームA側
  [フォーム]
  メニュー作成

  [ソース]
コード:
    Private Declare Function SetParent Lib "user32" _
     (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
    Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _
     (ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
      ByVal nWidth As Integer, ByVal nHeight As Integer, _
      ByVal bRepaint As Integer) As Integer

    Private Sub MenuItem1_Click_1 _
     (ByVal sender As System.Object, ByVal e As System.EventArgs) _
     Handles MenuItem1.Click
            '@起動
            Dim prc As System.Diagnostics.Process = _ 
                  System.Diagnostics.Process.Start("c:\Project1.exe")
            Dim i As Integer

            'アイドル状態になるまで待機
            prc.WaitForInputIdle()

            'A子フォーム設定
            i = SetParent(prc.MainWindowHandle.ToInt32, Me.Handle.ToInt32)
            'Bウィンドウ移動
      MoveWindow(prc.MainWindowHandle, 0, 100, 500, 500, 1)          
    End Sub
  


フォームB側(c:\Project1.exe)
ひとまずフォーム1つだけ

上記で[c:\Project1.exe]を[notepad.exe]とすると@ABともにきちんと動きます。
なので、フォームB側の設定不足かとも思うのですが。
何か設定が足りないのかもしくは別の方法でも上記の実現方法などありましたら
アドバイスよろしくお願いいたしします。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-01-18 17:44
中途半端な回答になります。。すいません。

詳細原因は不明なのですが、
起動した”Project1.exe”のMainWindowHandle(prc.MainWindowHandle)の値が
目的のウィンドウのメインハンドルでは無いようです。

ためしに、VB6で作成したexeのFormのCaption名を用い、
別API:FindWindow()でCaption名からウィンドウハンドルを取得し、
値を比較したところ、そうでした。

FindWindow()で取得したハンドルを使用すると、
SetParent()もMoveWindow()も成功します。

SPYにてウィンドウハンドルからウィンドウクラス名を確認しましたが、
○prc.MainWindowHandle ->ThunderRT6Main  クラス
○FindWindow() ->ThunderRT6FormDC クラス
です。

試しましたが、VC++で作成した物はこのようなことにはなりません。
VB6特有のことかもしれませんが・・。??

中途半端でごめんなさい・・。


1

スキルアップ/キャリアアップ(JOB@IT)