Tag: com

DisposableAction和Marshal.ReleaseComObject

做一些办公室Interop,代码是Type try { selection = getSelected(Return.Some.Office.InteropObject); for ( int i = 0 ; i < selection.count ; i++) yield return selection.item(i) } finally { Marshal.ReleaseComObject(selection); } 想知道用DisposableAction替换它是否是个好主意并改为 using ( var a = new DisposableAction(getSelected(Return.Some.Office.InteropObject)) ) { foreach(var b in a.Items) yield return b; }

使用ExeCOMServer时,无法将类型为“…”的COM对象转换为接口类型“…”

我正在使用这个exe com服务器: https://cfx.svn.codeplex.com/svn/Visual%20Studio%202008/CSExeCOMServer/ExeCOMServer.cs 我的编程是一个com应用程序 采用另一个com对象的我的com方法是void Init(AppsScriptRunningContext rc); 在这个方法中,我尝试读出一个属性并得到此错误 无法将“AppsScriptLib.AppsScriptRunningContextClass”类型的COM对象强制转换为接口类型“AppsScriptLib.IAppsScriptRunningContext”。 此操作失败,因为对于具有IID“{4D2E5723-87C2-49C1-AA28-ED2D88275100}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULTexception:0x80004002(E_NOINTERFACE)) 如果我的应用程序不是com服务器而是普通的com应用程序,则没有错误。 这就是为什么我认为错误是由exe com服务器产生的。 https://cfx.svn.codeplex.com/svn/Visual%20Studio%202008/CSExeCOMServer/ExeCOMServer.cs 问候,克里斯

如何连接COM事件调度程序?

VBIDE API公开了奇妙的神秘_dispVBComponentsEvents接口(以及其他),它看起来像我可以用来捕获VBE中的各种有趣事件。 所以我在一个类中实现了接口,该类打算捕获事件并为我的应用程序的其余部分引发“正常”.net事件,如下所示: public class VBComponentsEventDispatcher : _dispVBComponentsEvents { public event EventHandler<DispatcherEventArgs> ComponentAdded; public void ItemAdded(VBComponent VBComponent) { OnDispatch(ComponentAdded, VBComponent); } public event EventHandler<DispatcherEventArgs> ComponentRemoved; public void ItemRemoved(VBComponent VBComponent) { OnDispatch(ComponentRemoved, VBComponent); } public event EventHandler<DispatcherRenamedEventArgs> ComponentRenamed; public void ItemRenamed(VBComponent VBComponent, string OldName) { var handler = ComponentRenamed; if (handler != null) { handler.Invoke(this, new […]

来自C ++ COM的C#的字符串

我有一个C ++ DLL,一些函数返回Unicode以null结尾的字符串: void SomeFunc(wchar_t* StrBuf) 调用者必须分配StrBuf – 字符串最多可以包含256个字符。 此DLL还公开COM对象以通过COM从C#使用此DLL。 IDL中的定义: [id(1), helpstring(“bla”)] HRESULT SomeFunc([in,out] BSTR* TextStr, [out,retval] LONG* RetValue); 目前C#代码如下所示: string val = new string(‘\0’, 256); // Allocate memory MyComObj.SomeFunc(ref val); // Get string val = val.Substring(0, val.IndexOf(‘\0’)); // Convert from null-terminated string 有没有办法定义这样的COM函数,以便可以更容易地从C#中使用它? 现在它看起来很丑,如果函数有两个字符串参数,则需要三行来调用函数或五行。

将两种不同类型的事件分配给事件处理程序的区别

我在SO中看到了这个示例代码,它说一个练习很糟糕而另一个很好。 但我不明白为什么? 事实上,我得到了那个着名的RCW COM对象错误,该post说这可能是一个原因。 public class SomeClass { private Interop.ComObjectWrapper comObject; private event ComEventHandler comEventHandler; public SomeClass() { comObject = new Interop.ComObjectWrapper(); // NO – BAD! comObject.SomeEvent += new ComEventHandler(EventCallback); // YES – GOOD! comEventHandler = new ComEventHandler(EventCallback); comObject.SomeEvent += comEventHandler } public void EventCallback() { // DO WORK } } 编辑:这是源的链接: 不能使用已与其基础RCW分离的COM对象

E_NOINTERFACE在尝试获取类方法指针时

我正在从C ++非托管代码中调用C#方法。 我从数组中返回的类实例获取值时遇到问题。 我已经简化了一些代码 这是有问题的方法。 [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)] public ScOrder[] GetOrders() { return new ScOrder[] { (new ScOrder(1), (new ScOrder(2) }; } 这是IScOrder接口 [ComVisible(true)] [Guid(“B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E”)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IScOrder { long GetQuantity(); } 这就是ScOrder的实现 [ComVisible(true)] [Guid(“F739759E-4D00-440E-B0B7-69AAF97FCB6D”)] [ClassInterface(ClassInterfaceType.None)] public class ScOrder { private long quantity = 0; public ScOrder() {} public ScOrder(long quantity) { […]

VBA和“类不支持自动化或不支持预期的接口”

我有ComVisible类的.NET程序集。 几天前(我可以通过git确切地发现那个时刻)发生了一些事情–Excel不再看到这个类了。 所以: 我有接口 [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface MyInterface { … } 和class级 [ClassInterface(ClassInterfaceType.None)] [ComVisible(true)] [ProgId(“MyClass.Id”)] public class MyClass { … } Excel通过创建实例 Dim c as MyClass Set c = New MyClass 早期的一切都像魅力,但删除一些方法(从界面和类)后Excel很疯狂 – 它向我显示错误Class doesn’t support Automation or does not support expected interface 。 哪里可以成问题? 我查了几次。 删除某些方法后发生错误 这个类是部分的(可能问题出在这里?) 早些时候一切都工作..

COM方法调用在哪里执行

让我们说,我正在执行一个用c#编写的exe(只是我选择的语言)。 它有以下代码: var comObj=new ComClass(); comObj.DoSomething(); 现在,我想知道在哪个进程中执行了DoSomething方法。 它是当前exe运行或不同进程响应DoSomething调用的进程吗?

什么是String 以及如何投射它?

我目前处于不幸的位置,不得不通过COM Interop从C#调用VBA宏。 宏返回一个字符串数组,看起来像: Public Function Foo() As String() 然后我试图在C#中转换为一个字符串数组,如下所示: var result = (string[])xlApp.Run(“Foo”, … missing args …) 然后导致运行时错误: 无法将类型为’System.String [*]’的对象强制转换为’System.String []’。 有谁知道String [*]是什么,你是否知道如何将它转换为C#string []? 这个演员在我创建的一个简单的测试用例中工作。 我能看到的唯一区别是,在简单的情况下,我在VBA中的数组是字符串类型(0到5),而在更复杂的情况下,它是字符串类型(1到6)。 这可能是原因,如果是这样,我的VBA相当生疏 – 我该如何解决? 非常感谢, 乔恩

如何处理从VBA中的C#方法返回的字符串数组

我在C#中编写了一个返回字符串数组的程序集,C#代码如下: [ComVisible(true)] public class PostcodeFinder { public string[] SearchPostcodes(string postCode) { var searchService = new QuickAddress(“http://xxxx:xxxx/”) {Engine = QuickAddress.EngineTypes.Singleline, Flatten = true}; var mPicklist = searchService.Search(“GBR”, postCode, PromptSet.Types.OneLine); var x = mPicklist.Picklist.Items.Count(); var resultsToReturn = new string[x]; for (var i = 0; i < x; i++) { resultsToReturn[i] = mPicklist.Picklist.Items[i].PartialAddress; } return resultsToReturn; } } […]