2013-08-20 4 views
0

У меня есть пара вопросов, связанных с элементами управления IIS и ActiveX.Конструктор элемента управления ActiveX вызывает второй раз

Я разрабатываю управление ActiveX в этом учебнике http://haseebakhtar.wordpress.com/2011/05/31/creating-an-activex-control-in-net-using-c/. Я использую IE9 для тестирования и VS 2010 как IDE. Вот код:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Drawing; 


namespace AxControls 
{ 
    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.None)] 
    [Guid("42BBA00A-515E-45b5-9EAF-3827F7AEB4FA")] 
    [ProgId("AxControls.HelloWorld")] 
    [ComDefaultInterface(typeof(IClip))] 
    public class HelloWorld : UserControl, IObjectSafety, IClip 
    { 
     public HelloWorld() 
     { 
      MessageBox.Show("Starting"); 
     } 

     [STAThread] 
     public Image GetClipboardImage() 
     { 
      MessageBox.Show("try to get image"); 
      Image returnImage = null; 
      if (Clipboard.ContainsImage()) 
      { 
       MessageBox.Show("getting image"); 
       returnImage = Clipboard.GetImage(); 
      } 
      return returnImage; 
     } 

     private void SaveImage(Image image) 
     { 
      try 
      { 
       if (image != null) 
       { 
        MessageBox.Show("saving image"); 
        image.Save("C:\\test.jpg"); 
       } 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.StackTrace); 
      } 
     } 

     public void SaveImgFromClipBoard() 
     { 
      Image img = GetClipboardImage(); 
      SaveImage(img); 
     } 

     #region IObjectSafety Members 
     public enum ObjectSafetyOptions 
     { 
      INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001, 
      INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002, 
      INTERFACE_USES_DISPEX = 0x00000004, 
      INTERFACE_USES_SECURITY_MANAGER = 0x00000008 
     }; 

     public int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions) 
     { 
      ObjectSafetyOptions m_options = ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_CALLER | ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_DATA; 
      pdwSupportedOptions = (int)m_options; 
      pdwEnabledOptions = (int)m_options; 
      return 0; 
     } 
     public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) 
     { 
      return 0; 
     } 
     #endregion 
    } 
} 

Вот еще один код:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace AxControls 
{ 
    [ComImport()] 
    [Guid("5DC2DE9B-8D7D-490e-A904-C8CBFFD38412")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    interface IObjectSafety 
    { 
     [PreserveSig()] 
     int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions); 
     [PreserveSig()] 
     int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions); 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace AxControls 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    [Guid("013BFB31-B3F8-4bae-B5C2-5F6D22B815E3")] 
    public interface IClip 
    { 
     void SaveImgFromClipBoard(); 
    } 
} 

и то, как я это называю:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace AxControls 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    [Guid("013BFB31-B3F8-4bae-B5C2-5F6D22B815E3")] 
    public interface IClip 
    { 
     void SaveImgFromClipBoard(); 
    } 
} 

1) Так что, когда я обновив страницу I см. два окна сообщений с «Запуск», и они появляются один за другим. Я не понимаю, почему. Я запускаю его в режиме отладки (используя внутри него IIS, конечно, веб-проект ASP.NET + HTML-файл). Это мой пост сборки действия

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x86\gacutil.exe" /f /i "$(TargetDir)$(TargetFileName)" 
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /f /i "$(TargetDir)$(TargetFileName)" 

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /unregister "$(TargetDir)$(TargetFileName)" 
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /unregister "$(TargetDir)$(TargetFileName)" 

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)" 
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)" 

Я даже пытался использовать его на веб-сервере Apache - но была такая же ситуация - конструктор, кажется, дважды вызывает.

2) Много раз, когда я меняю свой HTML-файл в Visual Studio и запускаю его в режиме отладки, изменения не отображаются в моем браузере. Я пытался очистить историю IE и кеш без успеха. Похоже, IIS помещает его в кеш. Может ли так быть? Как я могу избежать этого?

3) Я не могу понять цель добавления всех членов IObjectSafety.

UPDATE:

<html> 
    <head> 

     <object name="axHello" style='display:none' id='axHello' classid='CLSID:42BBA00A-515E-45b5-9EAF-3827F7AEB4FA' 
codebase='AxControls.cab#version=1,0,0,0'></object> 
     <script language="javascript"> 

     <!-- Load the ActiveX object --> 
     var x = new ActiveXObject("AxControls.HelloWorld"); 

     <!-- Display the String in a messagebox ffff--> 
     x.SaveImgFromClipBoard(); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 
+1

Показать код HTML, в котором вы используете элемент управления (любые '' или 'новый объект ActiveXObject'). Используйте [IObjectSafety] (http://msdn.microsoft.com/en-AU/library/aa768224 (v = vs.85) .aspx) с осторожностью. Он в основном сообщает браузеру, что ваш контроль ** безопасен для ненадежных вызовов любой веб-страницей **, а не только вашей. Таким образом, вы заявляете, что ваш контроль ** нельзя злоупотреблять **, чтобы нанести ущерб операционной системе или конфиденциальности пользователя. – Noseratio

+1

Подробнее о 'IObjectSafety', вы в основном должны заблокировать свой контроль на своих собственных сайтах, вот как [как] (http://www.microsoft.com/en-us/download/details.aspx?id=23438) , – Noseratio

+0

Ой, извините, я забыл К ДОБАВИТЬ html-код. Теперь обновлено. –

ответ

1

Теперь, когда мы видели ваш HTML-код, это ясно: создать два отдельных объекта: один как object тег, еще один - динамически - в new ActiveXObject("AxControls.HelloWorld"). Снимите вторую, а просто позвонить:

axHello.SaveImgFromClipBoard(); 

Не забывайте о моих записях на IObjectSafety в комментариях. Лучше всего сделать это: lock your control на свои собственные сайты.

Относительно этого: 2) Много раз, когда я меняю свой HTML-файл в Visual Studio и запускаю его в режиме отладки, изменения не отображаются в моем браузере. Я пытался очистить историю IE и кеш без успеха. Похоже, IIS помещает его в кеш. Может ли так быть? Как я могу избежать этого?

Когда это произойдет в следующий раз, закройте все окна IE, а затем использовать Process Explorer, чтобы проверить, есть ли скрытый iexplore.exe процесс все еще висит. Если это так, убить его (все экземпляры), а затем очистить кэш. В следующий раз он должен загрузить новую версию вашей страницы.

Если это произойдет, это на самом деле плохой признак того, что ваш контроль не отключается должным образом (но это будет предметом отдельного вопроса).

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