none
C# で作成したActiveXにParamタブでパラメータを指定しても、ActiveX側が受け取れない RRS feed

  • 質問

  • Icyfireです。1回Windowsクライアント開発に質問しましたが、2,3日を経っても、返事がないので、

    このカタログの方が詳しいと思って、再度質問させていただきます。

    環境:Vs2013 + IE11 + Window8.1+ FW4.5(ActiveX開発のFW)

    ActiveXの作成方法を練習しています。現在ではActiveXを作成しましたが、Htmlにparamタグでパラメータを渡そうと、ActiveX側は受け取れません。

    ActiveXの関連ソース(ネット上にあるサンプルです)

    [ProgId("Dendrite.WebForce.MMP.Web.OurActiveX")]
    	[ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))] //Implementing interface that will be visible from JS
    	[Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
    	[ComVisible(true)]
    	public class ActiveXObject
    	{
    		private string myParam = "Empty"; 
    		public ActiveXObject()
    		{			
    		}
    		public event ControlEventHandler OnClose;		
    		[ComVisible(true)]
    		public void Open()
    		{
    			MessageBox.Show(myParam);
    			Thread.Sleep(2000); 
    			Close(); 
    		}		
    		[ComVisible(true)]
    		public string MyParam
    		{
    			get
    			{
    				return myParam;
    			}
    			set
    			{
    				myParam = value;
    			}
    		}

    HTMLのソースは下記です。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <body > <button onclick="OpenActiveX();">開く</button> <!-- Our activeX object --> <OBJECT id="OurActiveX" name="OurActiveX" classid="clsid:121C3E0E-DC6E-45dc-952B-A6617F0FAA32" VIEWASTEXT codebase="OurActiveX.cab"> <param name="MyParam" value="aaaaaaaaaaaaaaaaaaaa"> </OBJECT> <!-- Attaching to an ActiveX event--> <script language="javascript"> function OurActiveX::OnClose(redirectionUrl) { alert(redirectionUrl); } </script> <script language="javascript"> function OpenActiveX() { try { //document.OurActiveX.MyParam = "ABCDE" document.OurActiveX.Open(); } catch(Err) { alert(Err.description); } } </script> </body> </html>

    問題1、上記のActiveXを作成して、IEでActiveXを組んだHtmlを開き、ボタンをクリックしますと、ActiveXのOpenメソッドのMessageBoxは"Empty"で表示されています。つまり、パラメータはうまく取れていません。

    上記のHTMLソースに<Param>タグを利用ではなく、document.OurActiveX.MyParam = "ABCDE" の形だと、ActiveX側は受け取れます!!!

    問題2、パラメータの渡し方はdocument.OurActiveX.MyParam = "ABCDE"にしてから、当HTMLをAsp.net のWebサイトにコピーし、

    再度開いたら、「メンバーが見つかりません」のエラーが表示されます。また失敗しました。原因はMyParamが認識できません。

    なぜですか?

    • 移動 星 睦美 2016年9月21日 8:27 Internet Explorer から
    2016年8月26日 1:08

回答

  • Windowsクライアント開発の方が適当だと思うけど削除されていたのでこっちに
    [ComImport()]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("37D84F60-42CB-11CE-8135-00AA004BB851")]
    public interface IPersistPropertyBag
    {
        void GetClassID(out Guid pClassID);
        void InitNew();
        void Load(IPropertyBag pProgBag, IErrorLog pErrorLog);
        void Save(IPropertyBag pProgBag, bool fClearDirty, bool fSaveAllProperties);
    };
    
    
    [ComImport]
    [Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyBag
    {
        [PreserveSig]
        int Read([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [Out, MarshalAs(UnmanagedType.Struct)] out object pVar, IErrorLog pErrorLog);
    
        [PreserveSig]
        int Write([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [In, MarshalAs(UnmanagedType.Struct)] ref object pVar);
    }
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
    public interface IErrorLog
    {
        void AddError(string pszPropName, ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo);
    }
    
    
    public partial class ActiveXObject : IPersistPropertyBag
    {
        public void InitNew()
        {
            //System.Diagnostics.Debugger.Launch();
    
        }
        public void GetClassID(out Guid classID)
        {
            //System.Diagnostics.Debugger.Launch();
            classID = this.GetType().GUID;
        }
    
        public void Load(IPropertyBag pPropBag, IErrorLog pErrorLog)
        {
            System.Diagnostics.Debugger.Launch();
    
    
            object value = null;
            try
            {
                if (pPropBag.Read("MyParam", out value, null) == 0)
                {
                    this.MyParam = (value ?? "<NULL>").ToString();
                }
            }
            catch (Exception ex)
            {
                throw;
            }
    
        }
    
        public void Save(IPropertyBag pPropBag, bool fClearDirty, bool fSaveAllProperties)
        {
            //System.Diagnostics.Debugger.Launch();
        }
    }
    
    #24時間張り付いて回答だけをしているわけではないのですよ…

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年8月26日 3:30

すべての返信

  • .......

    表示数が多いだけど、返信が一つもない!!!

    質問の内容が理解できない??質問仕方の問題??

    それともActiveXは昔の技術なので、現在ではみんな触っていない???

    原因はわからないわ。

    悩むね…

    悩ing…

    悩ing続き…

    2016年8月26日 2:49
  • Windowsクライアント開発の方が適当だと思うけど削除されていたのでこっちに
    [ComImport()]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("37D84F60-42CB-11CE-8135-00AA004BB851")]
    public interface IPersistPropertyBag
    {
        void GetClassID(out Guid pClassID);
        void InitNew();
        void Load(IPropertyBag pProgBag, IErrorLog pErrorLog);
        void Save(IPropertyBag pProgBag, bool fClearDirty, bool fSaveAllProperties);
    };
    
    
    [ComImport]
    [Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyBag
    {
        [PreserveSig]
        int Read([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [Out, MarshalAs(UnmanagedType.Struct)] out object pVar, IErrorLog pErrorLog);
    
        [PreserveSig]
        int Write([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [In, MarshalAs(UnmanagedType.Struct)] ref object pVar);
    }
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
    public interface IErrorLog
    {
        void AddError(string pszPropName, ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo);
    }
    
    
    public partial class ActiveXObject : IPersistPropertyBag
    {
        public void InitNew()
        {
            //System.Diagnostics.Debugger.Launch();
    
        }
        public void GetClassID(out Guid classID)
        {
            //System.Diagnostics.Debugger.Launch();
            classID = this.GetType().GUID;
        }
    
        public void Load(IPropertyBag pPropBag, IErrorLog pErrorLog)
        {
            System.Diagnostics.Debugger.Launch();
    
    
            object value = null;
            try
            {
                if (pPropBag.Read("MyParam", out value, null) == 0)
                {
                    this.MyParam = (value ?? "<NULL>").ToString();
                }
            }
            catch (Exception ex)
            {
                throw;
            }
    
        }
    
        public void Save(IPropertyBag pPropBag, bool fClearDirty, bool fSaveAllProperties)
        {
            //System.Diagnostics.Debugger.Launch();
        }
    }
    
    #24時間張り付いて回答だけをしているわけではないのですよ…

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年8月26日 3:30
  • Windowsクライアント開発の方が適当だと思うけど削除されていたのでこっちに
    [ComImport()]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("37D84F60-42CB-11CE-8135-00AA004BB851")]
    public interface IPersistPropertyBag
    {
        void GetClassID(out Guid pClassID);
        void InitNew();
        void Load(IPropertyBag pProgBag, IErrorLog pErrorLog);
        void Save(IPropertyBag pProgBag, bool fClearDirty, bool fSaveAllProperties);
    };
    
    
    [ComImport]
    [Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyBag
    {
        [PreserveSig]
        int Read([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [Out, MarshalAs(UnmanagedType.Struct)] out object pVar, IErrorLog pErrorLog);
    
        [PreserveSig]
        int Write([In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName, [In, MarshalAs(UnmanagedType.Struct)] ref object pVar);
    }
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("3127CA40-446E-11CE-8135-00AA004BB851")]
    public interface IErrorLog
    {
        void AddError(string pszPropName, ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo);
    }
    
    
    public partial class ActiveXObject : IPersistPropertyBag
    {
        public void InitNew()
        {
            //System.Diagnostics.Debugger.Launch();
    
        }
        public void GetClassID(out Guid classID)
        {
            //System.Diagnostics.Debugger.Launch();
            classID = this.GetType().GUID;
        }
    
        public void Load(IPropertyBag pPropBag, IErrorLog pErrorLog)
        {
            System.Diagnostics.Debugger.Launch();
    
    
            object value = null;
            try
            {
                if (pPropBag.Read("MyParam", out value, null) == 0)
                {
                    this.MyParam = (value ?? "<NULL>").ToString();
                }
            }
            catch (Exception ex)
            {
                throw;
            }
    
        }
    
        public void Save(IPropertyBag pPropBag, bool fClearDirty, bool fSaveAllProperties)
        {
            //System.Diagnostics.Debugger.Launch();
        }
    }
    #24時間張り付いて回答だけをしているわけではないのですよ…

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    ご回答頂き有難うございました。

    マイクロソフトのIPropertyBagインタフェースをご利用になりましたね。

    警告安全マークのIObjectSafetyは実装しましたが、IPropertyBagインターフェースが全然知りませんでした。

    ご提供頂いたソースを参照しながら、実装して、確認させて頂きました。

    Objectの<Param>で指定したパラメータがうまく取れました。

    本当に勉強になりました。

    どうも有難うございました。

    2016年8月30日 6:40