我应该使用什么标准来决定是否像这样编写VBA代码:
Set xmlDocument = New MSXML2.DOMDocument
Run Code Online (Sandbox Code Playgroud)
或者像这样:
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
Run Code Online (Sandbox Code Playgroud)
?
我有一个.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
我没有太多的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我在哪里可以找到它?
我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项.它通过ClickOnce部署.运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的"fooapi.dll".是否有任何首选方法来检查并查看在C#中运行时是否注册了"fooapi.dll"?
我错过了一个Excel.Application.Quit或一个Excel.Application.BeforeQuit事件.有人知道模仿这些事件的解决方法吗?
我通过COM Interop从C#WinForms应用程序访问Excel.给定一个Excel.Application对象,我该怎么做:
请注意:由于我有一个COM引用Excel.Application,当Excel被用户"退出"时,Excel进程不会退出.虽然这听起来很矛盾,但事实就是如此.通过"退出"我的意思是用户点击窗口右上角的"退出"或"十字按钮".窗口关闭,文件被卸载,加载项被卸载以及Excel除了我没有任何线索之外做的任何东西.但是我仍然可以使用该Application对象来"恢复"该过程并使Excel再次可见,尽管这些加载项随后丢失,而且我还不知道还有什么处于未定义状态.
为了摆脱这个问题,我想在一开始就取消退出(想想BeforeQuit Cancel = true它是否存在),或者至少在退出Excel时得到通知,这样我就可以释放COM对象并使流程真正退出,下次我再次需要Excel时,我会知道我需要先启动它.
不幸的是,它是一个恶性循环:只要Excel运行,我需要COM对象.因此,在 Excel退出之前,我无法处理它们.另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,因此我不能等待进程退出事件或类似事件.
我有一种令人不快的感觉,就是我要把头撞在砖墙上......
我为Internet Explorer(BHO)编写附加组件,我正在使用CComPtr智能指针.我想知道:
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(就像之前提到的链接一样)?
CComPtr getObjects(CComQIPtr<IHTMLDocument3> …
我只是将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的更高版本!
谢谢
我的开发环境是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访问被拒绝".
并按照以下说明跟进这些说明:
DCOMCNFG这似乎照顾了PHP的COM框架的访问权限问题.
我有一个使用内部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对象.
什么似乎是问题?
我正在使用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)
谢谢