2012-06-08 2 views
0

Я пытаюсь сделать ActiveX с помощью C# с COM-видимым. Это форма Windows. Я построил его успешно как dll ActiveX, затем я написал код VBScript, чтобы позвонить ему. После этого появилось, но исчезло. Я не знаю, почему @@ Вот мой код:Создайте GUI в C# и вызовите VBScript

C# код

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using Microsoft.Win32; 
using System.Reflection; 

namespace ActiveXTestLibrary 
{ 
    [ProgId("ActiveXTestLibrary.UserControl")] 
    [ClassInterface(ClassInterfaceType.AutoDispatch)] 
    [ComVisible(true)] 
    public partial class UserControl1 : Form 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 


     [ComVisible(true)] 
     public void Hello() 
     { 
      this.Show(); 
     } 

     private void radButton1_Click(object sender, EventArgs e) 
     { 
      this.lblResult.Text = "I am a .NET user control happily living \ninside an ActiveX container. Cheers."; 
     } 

     [ComRegisterFunction()] 
     public static void RegisterClass(string key) 
     { 
      StringBuilder sb = new StringBuilder(key); 
      sb.Replace(@"HKEY_CLASSES_ROOT\", ""); 

      RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); 

      RegistryKey ctrl = k.CreateSubKey("Control"); 
      ctrl.Close(); 

      RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); 
      inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase); 
      inprocServer32.Close(); 

      k.Close(); 
     } 

     [ComUnregisterFunction()] 
     public static void UnregisterClass(string key) 
     { 
      StringBuilder sb = new StringBuilder(key); 
      sb.Replace(@"HKEY_CLASSES_ROOT\", ""); 

      RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); 

      if (k == null) 
      { 
       return; 
      } 
      k.DeleteSubKey("Control", false); 

      RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); 

      inprocServer32.DeleteSubKey("CodeBase", false); 

      inprocServer32.Close(); 
     } 
    } 
} 

и VBScript:

Sub main 
    set objTest = CreateObject("ActiveXTestLibrary.UserControl") 
    objTest.Hello 
end sub 

call main 

ответ

0

Чтобы показать форму, что нужно, чтобы начать цикл обработки сообщений по телефону Application.Run: функция

[ComVisible(true)] 
public void Hello() 
{ 
    Applicaiton.Run(this); 
} 

Шоу() будет показывать форму и немедленным с выходом. Application.Run() не выйдет, пока форма не будет закрыта.

+0

фантастический человек. Оно работает. большое спасибо – fatpipp

Смежные вопросы