powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / .NET объект, к-рый используется в СОМ и события в нем
12 сообщений из 12, страница 1 из 1
.NET объект, к-рый используется в СОМ и события в нем
    #32801870
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мне надо написать код класса, к-рый будет вызываться из COM и иметь собственные события, тоже доступные в СОМ-среде? ЧТобы можно было написать что-то типа:


sub OnTest2()
msgbox "VBSCRIPT OnTest"
end sub

set obj = createobject("TestCls.TestCls")
set obj.OnBeforeStartTest = GetRef("OnTest2")
obj.TEST
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32801906
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802019
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
если используешь позднее связывание (вызов метода TEST) - нужно для всего контрола (объекта) сделать/сгенерить интерфейс IDispatch
Код: plaintext
[ClassInterface(ClassInterfaceType.AutoDispatch)]
а сам метод TEST должен быть public (ест-но).
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802095
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифига не помогает.

на строке

set obj.OnBeforeStartTest = GetRef("OnTest2")

выдает

Microsoft VBScript runtime error: Object doesn't support this property or method: 'obj.OnBeforeStartTest

.NET объект:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        [DispIdAttribute(0x60020000)]
        void MigrationEvent();
    }
    
    public delegate void MigrationEventHandler();

    [ 
        ClassInterface(ClassInterfaceType.AutoDispatch),
        ComSourceInterfaces(typeof(ControlEvents))
    ]
    public class TestCls
    {
      public event MigrationEventHandler OnBeforeStartTest;

        public void TEST()
        {
            Console.WriteLine("TEST()");
            if (OnBeforeStartTest != null)
                OnBeforeStartTest();
        }

    }



В лучшем случае выводит "TEST()" если вызвать obj.TEST
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802366
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
[Guid("AF431272-4194-49e1-AABF-61FFDAF9CF8F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ControlEvents
{
  [DispIdAttribute(0x60020000)]
  void OnBeforeStartTest(); // <-- интерфейс события должен включать метод
}
PS
проверил твой пример на скриптах в IE
(и на vbscript и на jscript).
с этим исправлением работает.
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802586
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузя
Код: plaintext
1.
2.
3.
4.
5.
6.
[Guid("AF431272-4194-49e1-AABF-61FFDAF9CF8F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ControlEvents
{
  [DispIdAttribute(0x60020000)]
  void OnBeforeStartTest(); // <-- интерфейс события должен включать метод
}
PS
проверил твой пример на скриптах в IE
(и на vbscript и на jscript).
с этим исправлением работает.

а проверочный скрипт на VBS в ИЕ можешь кинуть?
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802600
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут ссылку нарыл. Как ее пример сделать рабочей - не знаю, она на испанском. Может, есть аглицкий вариант?
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802658
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в
my computer -> manage -> services and applications -> internet information services -> web sites -> default web site
по правой кнопке мыши создать
new -> virtual directory
alias:BlackMore
directory:путь к директории с проектом

сам проект: C# class library
на выходе: Blackmore.dll
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Blackmore
{
  [Guid("AF431272-4194-49e1-AABF-61FFDAF9CF8F")]
  [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  public interface ControlEvents
  {
    [DispIdAttribute(0x60020000)]
    void OnBeforeStartTest();
  }
    
  public delegate void MigrationEventHandler();

  [Guid("9DB0252B-C1E9-44b1-BFF7-C4031AC42B2F")]
  [ClassInterface(ClassInterfaceType.AutoDispatch), ComSourceInterfaces(typeof(ControlEvents))]
  public class TestCls : System.Windows.Forms.UserControl
  { public TestCls(){ InitializeComponent(); }
	
    public event MigrationEventHandler OnBeforeStartTest;

    public void TEST()
    {	
      if(OnBeforeStartTest!=null) OnBeforeStartTest();
    }
    private void InitializeComponent()
    {
      //this.Name = "TestCls";
      //this.Size = new System.Drawing.Size(142, 42);
    }	
  }
}
скрипт: файл blackmore.htm лежит в директории проекта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<html>
  <head>
    <title>Blackmore Control Event</title>
    <meta name="vs_defaultClientScript" content="VBScript">
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  </head>
  <body ms_positioning="GridLayout">
		
    <OBJECT id="BlackmoreCtrl" align="top" classid="bin\Debug\Blackmore.dll#Blackmore.TestCls" VIEWASTEXT>
    </OBJECT>
		
    <SCRIPT LANGUAGE="VBSCRIPT">			
      sub BlackmoreCtrl_OnBeforeStartTest()
        alert("MyWindowControl_ClickEvent - 1")
      end sub
    </SCRIPT>
		
    <SCRIPT LANGUAGE="JSCRIPT">
      function btn_clck()
      {
        BlackmoreCtrl.TEST();
        alert("MyWindowControl_ClickEvent - 2");
      } 
    </SCRIPT>
		
    <INPUT id="Button1" style="Z-INDEX: 101; LEFT: 20px; POSITION: absolute; TOP: 196px" type="button"
           value="Button" name="Button1" onclick="btn_clck()"> 
    <INPUT id="Text1" style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 196px" type="text"
           name="Text1">
  </body>
</html>
в строке адреса IE
http://localhost/blackmore/blackmore.htm
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802668
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что бы это работало врежиме отладки:
start -> settings -> control panel -> admistarative tools -> microsoft .net framework 1.1 configuration
на узле дерева Runtime Security Policy по правой кнопке мыши выбрать из контекстного меню adjust security
и далее в мастере
make changes to this computer
на закладке adjust the security level for each zone

выставить Full Trust для

my computer

local intranet

internet

trusted sites
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802783
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если убрать из кода упоминание о System.Windows.Forms.UserControl, то .НЕТ события перестают работать Мне надо просто компонент, а не ActiveX c GUI. Как тут быть?
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32802846
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
регистрируешь библиотеку для COM
Project -> Properties
в дереве выбираешь: Configuration Proprties -> Build
и выставляешь: Register for COM Interop = true

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>Blackmore Control Event</title>
    <meta name="vs_defaultClientScript" content="VBScript">
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  </head>

  <body ms_positioning="GridLayout">

    <SCRIPT LANGUAGE="VBSCRIPT">
      Dim BlackmoreCtrl
      Set BlackmoreCtrl = CreateObject("Blackmore.TestCls")
    </SCRIPT>
		
    <SCRIPT LANGUAGE="JSCRIPT">			
      function BlackmoreCtrl::OnBeforeStartTest()
      { 
        alert("BlackmoreCtrl TEST - 3");
      }
    </SCRIPT>
		
    <SCRIPT LANGUAGE="VBSCRIPT">
      Sub btn_clck()
        BlackmoreCtrl.TEST
        alert("BlackmoreCtrl TEST - 2")
      End Sub
    </SCRIPT>
		
    <INPUT id="Button1" style="Z-INDEX: 101; LEFT: 20px; POSITION: absolute; TOP: 196px" type="button"
           value="Button" name="Button1" onclick="btn_clck()"> 
    <INPUT id="Text1" style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 196px" type="text"
           name="Text1">
  </body>
</html>

но, imho, тебе нужно что то наподобие: Scripting Events
...
Рейтинг: 0 / 0
.NET объект, к-рый используется в СОМ и события в нем
    #32804213
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогло вот что:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sub OnTest2()
        msgbox "VBSCRIPT OnTest"
end sub

sub obj_OnBeforeStartTest()
        msgbox "VBSCRIPT OnTest"
end sub

set obj = createobject("DEMONS.Demo")
wscript.connectobject obj,"obj_"

obj.TEST



wscript.connectobject - волшебные слова
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / .NET объект, к-рый используется в СОМ и события в нем
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]