标签: com

使用New关键字和在Excel VBA中调用CreateObject有什么区别?

我应该使用什么标准来决定是否像这样编写VBA代码:

Set xmlDocument = New MSXML2.DOMDocument
Run Code Online (Sandbox Code Playgroud)

或者像这样:

Set xmlDocument = CreateObject("MSXML2.DOMDocument")
Run Code Online (Sandbox Code Playgroud)

com excel binding vba excel-vba

11
推荐指数
2
解决办法
8291
查看次数

是否可以从.NET测试COM暴露的程序集?

我有一个.NET程序集,我通过tlb文件向COM公开,以及一个注册tlb的安装程序.我已手动检查安装程序是否正常工作,并且COM客户端可以访问该库.到现在为止还挺好...

但是,我正在尝试组合一些自动系统测试,检查安装程序是否正常工作.作为其中的一部分,我已经在VM上自动安装,我现在想要对已安装的COM库进行一些调用以验证它是否正常工作.我最初想过在VB6中编写一些测试,但我已经有了一大堆用C#编写的测试,它引用了.NET程序集.我希望我可以更改这些以引用.tlb,但是当我在VS2008中尝试这个时出现错误:

ActiveX类型库'blah.tlb'是从.NET程序集导出的,无法添加为引用.

有什么方法可以欺骗VS2008允许我添加这个引用,也许是通过编辑tlb文件?

谷歌搜索没有提出任何解决方案.我发现的只是一篇Microsoft Connect文章,声明这是"按设计":http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?FeedbackID = 120882

c# com interop com-interop visual-studio

11
推荐指数
1
解决办法
7247
查看次数

COM接口指导

我没有太多的COM接口,所以我有一个小问题,说我有这个代码:

[Guid("148BD528-A2AB-11CE-B11F-00AA00530503"), 
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IEnumWorkItems {
    [PreserveSig()]
    int Next([In] uint RequestCount, [Out] out System.IntPtr Names, 
                       [Out] out uint Fetched);
    void Skip([In] uint Count);
    void Reset();
    void Clone([Out, MarshalAs(UnmanagedType.Interface)] 
                          out IEnumWorkItems EnumWorkItems);
}
Run Code Online (Sandbox Code Playgroud)

我怎么知道"148BD528-A2AB-11CE-B11F-00AA00530503"对应于IEnumWorkItems:http://msdn.microsoft.com/en-us/library/aa380706( VS.85).aspx

就像我想知道这个界面的GUID:http://msdn.microsoft.com/en-us/library/aa381811(VS.85).aspx我在哪里可以找到它?

.net c# com interface

11
推荐指数
1
解决办法
3347
查看次数

如何检查COM dll是否在C#中注册

我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项.它通过ClickOnce部署.运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的"fooapi.dll".是否有任何首选方法来检查并查看在C#中运行时是否注册了"fooapi.dll"?

c# com dll vsto regsvr32

11
推荐指数
1
解决办法
7807
查看次数

防止Excel退出

我错过了一个Excel.Application.Quit或一个Excel.Application.BeforeQuit事件.有人知道模仿这些事件的解决方法吗?

我通过COM Interop从C#WinForms应用程序访问Excel.给定一个Excel.Application对象,我该怎么做:

  1. 最好是防止Excel退出?
  2. 如果这不可能,我怎么能至少注意到 Excel退出的时候?

请注意:由于我有一个COM引用Excel.Application,当Excel被用户"退出"时,Excel进程不会退出.虽然这听起来很矛盾,但事实就是如此.通过"退出"我的意思是用户点击窗口右上角的"退出"或"十字按钮".窗口关闭,文件被卸载,加载项被卸载以及Excel除了我没有任何线索之外做的任何东西.但是我仍然可以使用该Application对象来"恢复"该过程并使Excel再次可见,尽管这些加载项随后丢失,而且我还不知道还有什么处于未定义状态.

为了摆脱这个问题,我想在一开始就取消退出(想想BeforeQuit Cancel = true它是否存在),或者至少在退出Excel时得到通知,这样我就可以释放COM对象并使流程真正退出,下次我再次需要Excel时,我会知道我需要先启动它.

不幸的是,它是一个恶性循环:只要Excel运行,我需要COM对象.因此, Excel退出之前,我无法处理它们.另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,因此我不能等待进程退出事件或类似事件.

我有一种令人不快的感觉,就是我要把头撞在砖墙上......

c# com excel interop excel-2007

11
推荐指数
2
解决办法
2679
查看次数

关于使用CComPtr的一些问题(当使用Release()时?我可以返回CComPtr吗?,...)

我为Internet Explorer(BHO)编写附加组件,我正在使用CComPtr智能指针.我想知道:

  1. 我什么时候应该使用CComPtr.Release()函数?

  2. 在这链接它是用来释放浏览器对象.我应该在哪里使用它?在'正常'使用(使用我自己的类)我不需要它.我应该在这种情况下使用它:
    我使用m_spWebBrowser-> get_Document(&spDispDoc)获取文档对象:
    void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
    {
        // Query for the IWebBrowser2 interface.
        CComQIPtr spTempWebBrowser = pDisp;
    
        // Is this event associated with the top-level browser?
        if (spTempWebBrowser && m_spWebBrowser &&
            m_spWebBrowser.IsEqualObject(spTempWebBrowser))
        {
            // Get the current document object from browser...
            CComPtr spDispDoc;
            hr = m_spWebBrowser->get_Document(&spDispDoc);
            if (SUCCEEDED(hr))
            {
                // ...and query for an HTML document.
                CComQIPtr htmlDoc2 = spDispDoc;
                m_spHTMLDocument = spHTMLDoc;
            }
        }
    
    }
    
    我应该像使用m_spWebBrowser一样在SetSite函数中释放spHTMLDocument(就像之前提到的链接一样)?
  3. 我可以安全地从函数返回CComPtr吗?
  4. 我的意思是这样的:
    CComPtr getObjects(CComQIPtr<IHTMLDocument3> …

c++ com bho smart-pointers

11
推荐指数
1
解决办法
1万
查看次数

EmptyParam现在变量是一个函数 - 如何解决遗留代码?

我只是将Delphi 6中编写的一些旧代码升级到Delphi XE2.不幸的是,代码引用了Word97 COM对象来生成一些.doc文档.代码中有Word97的直接使用子句.

我必须保持生成的文档与旧的Crystal Report和另一个需要文档格式的第三方应用程序使用的Word格式相同.

所以,问题.因为我在uses子句中使用Word97,所以编译器抱怨每当使用EmptyParam变量时,实际和正式var参数的类型必须相同.这直接来自Word97.pas源文件.这是因为现在将EmptyParam声明为函数而不是变量.

处理这个问题的最佳方法是什么?我应该将Delphi 6源文件(Word97.pas等)复制到我的本地目录中,直接将它们与System.Variants.pas一起添加到我的项目中,并将我的应用程序的编译器指令更改为包含EMPTYPARAM_VAR吗?我没有尝试过,但希望它会将EmptyParam声明为变量.或者也许有一个更简单的解决方案.

谢谢

编辑

这里有更多的背景信息,即使我已经接受了答案,以备将来参考.这是代码的一个例子(AddClaimsLetter是"应用程序"COM对象 - 即TWordApplication):

AddClaimsLetter.Documents.Open(Wordfile, EmptyParam, EmptyParam,
                        EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                        EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Run Code Online (Sandbox Code Playgroud)

在不改变任何内容的情况下,此处的EmptyParam参数在编译时失败,表示"E2033实际和正式var参数的类型必须相同".

但是,因为我想保留Word97(在Delphi 6 Ent.安装文件夹中的OCX/Server中),我确实需要将.pas文件复制到我的本地项目文件中并声明一个用于代替EmptyParam的变量(因为这些文件也试图编译,我得到了与上面相同的编译器错误).

所以现在都在工作,但我可能会与管理层讨论升级到此应用程序的Office的更高版本!

谢谢

delphi com

11
推荐指数
2
解决办法
3965
查看次数

PHP组件对象模型"访问被拒绝"

我的开发环境是PHP 5.3,IIS 7.5和Window7 Home.我正在开发一个原型应用程序,它需要PHP函数imagewindowgrab().此功能需要调用Windows组件对象模型(COM).

我的单行代码是这样的:


$browser = new COM("InternetExplorer.Application") or die("Unable to instantiate IE");

它产生了以下错误:


Fatal error: Uncaught exception 'com_exception' with message 
'Failed to create COM object `InternetExplorer.Application': Access is denied. ' 
in C:\inetpub\wwwroot\trial.php:8 Stack trace: #0 C:\inetpub\wwwroot\trial.php(8): com->com('InternetExplore...') #1 {main} thrown 
in C:\inetpub\wwwroot\trial.php on line 8

搜索了几个小时后,浏览.NET论坛,找到了很好的资源:

最终对我有用的是遵循这个SO问题的答案中概述的说明:
通过asp.net访问Office Word对象模型导致"由于以下错误而失败:80070005访问被拒绝".

并按照以下说明跟进这些​​说明:

  1. 在命令行输入 DCOMCNFG
  2. 在控制台根>组件服务>计算机>我的电脑上单击右键,然后选择属性
  3. 在选项卡COM安全性>访问权限上单击编辑默认并添加用户(例如IIS_IUSRS)或服务
  4. 检查允许本地访问

这似乎照顾了PHP的COM框架的访问权限问题.

php com iis

11
推荐指数
1
解决办法
6961
查看次数

使用COM从注册表加载类与ToolsVersion ="2.0"一起使用,但在使用ToolsVersion ="4.0"时失效

我有一个使用内部vb项​​目作为COM的ac #project.

当我将项目转换为VS 2010以下行时抛出异常:

Set RTCClient_ = New RTCCORELib.RTCClient
Run Code Online (Sandbox Code Playgroud)

RTCCore.RTCClient是Microsoft Merge Module for RTC(RTC Client API 1.2)的一部分,您可以将其嵌入到安装包中(在我的情况下包括EXE).

RTCCore.RTCClient是正在注册下注册表中的类HKEY_CLASSES_ROOT\RTCCore.RTCClient

我得到的错误是:

错误:自动化错误
找不到指定的模块.(-2147024770)

但是,如果我正在更改我的csproj并使用ToolsVersion="2.0"上面的行工作,我可以得到RTCClient对象.

什么似乎是问题?

c# vb6 com visual-studio-2010 merge-module

11
推荐指数
1
解决办法
341
查看次数

Excel.Workbook.SaveAs(...)具有相同的名称文件

我正在使用xls文件.如何保存(如果存在)与Windows桌面相同的文件名+"(副本1)".

方法saveCommande(...)

        if(!Directory.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "EE_Commande_Fournisseur"))
        {
            Directory.CreateDirectory(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\EE_Commande_Fournisseur");
        }
        xlWorkBook.SaveAs("EE_Commande_Fournisseur\\" + path, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, true, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\EE_Commande_Fournisseur\\" + path;

        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
        this.ReleaseComObject(xlApp,xlWorkBook);
        //sauvergarde dans la base de données
        _newAchatCommande.path = path;
        this._fileName = path;
        contexte.AddToAchatCommande(_newAchatCommande);
        contexte.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

谢谢

c# com excel

11
推荐指数
1
解决办法
9万
查看次数