Tag: com

在VSTO中获取Excel工作簿的Hashcode以启用基于状态的button

我正在创build一个VSTOfunction区AddIn for Excel,并且在我的应用程序中存储了一些工作簿状态信息,用于更新可视化button。 考虑到可以有多个工作簿,我将这个状态对象存储在ThisAddIn类的字典中。 我的问题是,我不知道如何得到一个独特的哈希/键/ Guid的工作簿,因为我得到的是一个COM包装不断改变散列。 够公平的,我完全明白这一点。 我已经使用了很长时间的一个解决scheme是创build一个GUID并将其存储在工作簿的CustomDocumentProperties中,并将基于此的状态映射为键。 这至less工作,但它失败,如果我创build工作簿的副本,并在相同的应用程序实例中打开,并具有相同的GUID多个工作簿。 现在我只是有一个想法,我想我可以在Workbook_Open事件上刷新这个Guid。 但是,这仍然是一个狡猾的解决scheme。 我在这里find第二个解决scheme: http : //social.msdn.microsoft.com/Forums/en-US/vsto/thread/04efa74d-83bd-434d-ab07-36742fd8410e/ 所以我用这个家伙的代码并创build了这个: public static class WorkbookExtensions { public static IntPtr GetHashery(this msExcel.Workbook workbook) { IntPtr punk = IntPtr.Zero; try { punk = Marshal.GetIUnknownForObject(workbook); return punk; } finally { //Release to decrease ref count Marshal.Release(punk); } } } 它在几分钟内运行得非常好,直到它开始向我提供访问Application.ActiveWorkbook时出现的臭名昭着的错误“已经与其基础RCW分离的COM对象不能使用”。 这是引用工作簿COM对象的安全方法吗? 如果我有两个function区应用程序都使用此方法来获取单个工作簿GUID? 如果其中一个应用程序在我的状态对象上运行垃圾收集器,它会调用一个终结器来调用Marshal.FinalReleaseComObject(workbook)? […]

将HRESULT转换为可读的消息

任何人都可以提供一些有关如何以编程方式将HRESULT( http://en.wikipedia.org/wiki/HRESULT )值转换为人类可读的消息的信息? 我知道实用程序ERR.EXE这样做,但我的应用程序需要显示一些有意义的消息给我的用户,而不是一个神秘的0x800A03EC。

在Excel VSTO中,如何检查工作表是否属于已closures的工作簿?

如果我有Worksheet的引用,并closures它的父Workbook ,引用不会消失。 但我无法弄清楚我应该如何检查以确保这些表不存在。 检查null不起作用。 例: Workbook book = Globals.ThisAddIn.Application.ActiveWorkbook; Worksheet sheet = (Worksheet)book.Worksheets[1]; // Get first worksheet book.Close(); // Close the workbook bool isNull = sheet == null; // false, worksheet is not null string name = sheet.Name; // throws a COM Exception 这是我尝试访问工作表时遇到的exception情况: System.Runtime.InteropServices.COMException was caught HResult=-2147221080 Message=Exception from HRESULT: 0x800401A8 Source=MyProject ErrorCode=-2147221080 StackTrace: […]

如何从Excel VBA中释放进程中的COM服务器对象

如何强制Excel(2007)VBA释放对COM服务器对象的引用? 我已经在Visual Foxpro 9 SP2中编写了一个inprocess(单实例DLL)COM服务器,它是从我的开发机器上的Excel 2007 VBA代码实例化的。 Excel似乎是持有一个COM对象/ DLL的引用,即使我设置=无。 这可以防止由于“文件访问被拒绝TestCOM.dll”消息重buildDLL,直到我退出Excel,每次我想要进行更改和testing时都很痛苦。 我已经把代码编译成了一个非常简单的testing设置:VFP9项目(TestCOM)只有一个.prg文件,内容如下 DEFINE CLASS TestClass As Session OLEPUBLIC ENDDEFINE VBA代码如下: Sub Test() Set objTest = CreateObject("TestCOM.TestClass") Set objTest = Nothing End Sub 我已经尝试删除在VBA项目中的COM服务器库的引用,但这没有任何区别。 我已经试过,没有DIMing的对象variables,它没有任何区别。 我曾尝试创build一个新的VFP DLL项目,但问题依然存在。 如果我作为一个INPROCESS / DLL生成VFP应用程序/ DLL并运行VBA代码,我得到这个问题,但如果我build立它作为一个OUTOFPROCESS / EXE并运行VBA代码,我不会得到这个问题。 我在COM对象清理中发现了一个非常类似的问题,只不过我的COM服务器是用Visual Foxpro 9 SP2编写的,而与C#相关,而OP没有详细解释他们是如何解决问题的,所以我不知道如何解决它; 如果这是可能的。

我如何识别MS Excel对象types?

我正在使用后期绑定的OLE自动化来处理Excel。 问题是我不知道如何使用Selection返回的值,因为我不知道它是什么types… 我怎样才能确定它返回给我什么样的对象? 我希望有一个types的名字…. 或者我必须通过一个我期待的价值清单?

当用户注销时,Excel COM自动停止工作

我开发了一个服务器应用程序,使用Excel 2007 COM自动化来转换一些xls文件。 它作为Windows Datacenter实例上的一个服务启动,在其自己的用户下运行,并且必须更改DCOM安全设置(“以交互式用户身份启动”)才能使其工作。 问题是,当我注销(通过RDP),它停止工作。 我login,它再次运作。 有没有人有同样的问题? 我很高兴现在有任何帮助。

使用Excel InteropclosuresExcel应用程序而不保存消息

我正在使用Excel Interop COM对象。 我正在写一个方法,我打开和closures一个Excel应用程序,然后打开一个Excel工作簿和工作表。 在完成他们的工作后,我正在closures应用程序和工作簿。 我的问题是,这个方法可以重复调用几次,当表和应用程序正在closures时,我从Excel应用程序获取消息,如果我想保存我所做的更改。 该方法卡住,直到我按“否”,但我不能告诉用户每次按下它。 如何closures应用程序而不收到此消息或至less通过代码回答? 这些是我用来closures应用程序和工作簿的方法: private void FreeWorkSheetResources(Excel.Worksheet sheet) { Marshal.ReleaseComObject(sheet); sheet = null; } private void FreeWorkBookResources() { if (_excelSheets != null) { Marshal.ReleaseComObject(_excelSheets); _excelSheets = null; } _excelWorkBook.Close(); Marshal.ReleaseComObject(_excelWorkBook); _excelWorkBook = null; } private void FreeApplicationResources() { _app.Quit(); Marshal.ReleaseComObject(_app); _app = null; GC.Collect(); } 这就是我使用它们的方式: if (_app == null) […]

在VBA和dll之间传递任意types的数据

所以我正在使用VBA加载一个C ++ dll的Excel项目。 我想要做的是能够传递一个没有特定types(数据可以是数字或分类)的Excel范围到C ++ DLL(我可以描述我的Excel范围的最佳方式是typesvariant )。 所以这些步骤可能涉及: 在VBA中加载dll 发送excel范围到dll(范围可能包含数字和/或string的列的列) 在Excel文件中处理Excel中的数据 我正在考虑使用Excel变体和C ++变体。 但是我不清楚如何使用C ++变体,因为我找不到任何好的文档。 我收到的另一个build议是COM编程。 我的问题: 一个善良的灵魂可能会为我提供关于如何进行的指针? (例如通过提供C ++原型,以及如何处理变体的简单示例) 有没有人知道有关使用C ++变体(也可能与VBA共同使用)的良好文档/教程? 如果速度是一个问题,是否使用COM更适合使用VARIANTS? 是使用C API的一个选项? 更新: 我需要操作的范围的大小可能很大(〜500,000行)。 速度是一个因素,因此,我想尽可能避免不必要的复制。

迟绑定一个数组

我很难过 ,因为我无法find任何关于在VBA中绑定数组的问题。 这甚至有可能吗? 如果是的话,怎么样? 如果不是 – 为什么? 注意:我不介意使用像.Net / C#这样的原生types Dim o as Object set o = CreateObject("System.Array") 即使System.Array是COM可见 ,似乎不可能实例化它。 任何想法如何延迟绑定VBA中的数组数据types? 请不要提及Dictionary或Collections,因为这个问题对于数组非常具体 附加信息: 这是我的另一个问题的后续行动。 由于似乎不可能将本地VBA数组传递到本地.Net集合而不循环,我只是想知道是否有可能延迟绑定一个数组,因为两者似乎都是安全的,这意味着它们是兼容的,因此将一个VBA数组传递给一个。净一个将是可能的 – 请纠正我,如果我完全错了。

如何隐藏excel列?

我需要完全隐藏一个excel列。 我用下面的代码,但没有工作: public void Hide (params string[] columns) { foreach(var column in columns) { Range range = (Range) oSheet.Columns[column, Type.Missing]; range.EntireColumn.Hidden = true; } } 我错过了什么?