Tag: com

C# – 编写COM服务器 – 映射到方法的属性

我们正在尝试替换最初为VB6应用程序编写的COM服务器 我们无法访问源代码。 出于某种原因,VB6应用程序可以调用我们的构造函数,但它得到: 系统错误&H80004002。 没有这样的接口支持。 我假设它试图获取QueryInterface的接口。 我们通过regasm / tlb和gacutil正确发送了我们的程序集,但后来我发现了一些奇怪的东西。 我打开了为程序集生成的.tlb文件regasm,并注意到我界面上的所有属性都显示为方法。 这是.Net工具正在做什么吗? 这会导致我的问题吗? 以下是原始文件的完整tlb定义: // Generated .IDL file (by the OLE/COM Object Viewer) // // typelib filename: UtopiaKeyboard.tlb [ uuid(9B4E1840-FF65-11CF-AA2E-0020AFA49D5A), version(1.0), helpstring(“OPOS POSKeyboard OLE Control”) ] library POSKEYBOARDLib { // TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} importlib(“STDOLE2.TLB”); // Forward declare all types defined […]

如何将SAFEARRAY从C#传递给COM?

我有一个ATL COM服务器,接口的方法是 CVivsBasic::UpdateSwitchPlan(BSTR plan_name, SAFEARRAY* plan) 这个函数的IDL看起来像 typedef struct { LONG time_to_play; BSTR ecportid; } SwitchPlanItem; HRESULT UpdateSwitchPlan([in] BSTR plan_name, [in] SAFEARRAY(SwitchPlanItem) plan) ; 我试着用C#这样调用它: internal void UpdateSwitch(string plan_name, string ecportid) { SwitchPlanItem sp1; sp1.time_to_play = 33; sp1.ecportid = ecportid; SwitchPlanItem sp2; sp2.time_to_play = 33; sp2.ecportid = ecportid; SwitchPlanItem[] sps = { sp1, sp2 }; […]

VSTOunit testing通过RequestComAddInAutomationService在C#.NET中添加Office

在过去的几周里,我一直在阅读各种StackOverflow问题和其他教程和文档(下面注意其中一些),试图找到一种unit testingVSTO AddIn的方法。 不幸的是,它总是在我的测试中导致E_NOINTERFACEexception。 我正在使用的代码如下 – 覆盖RequestComAddinAutomationService的ThisAddin部分类的一个提取,另一个描述测试实用程序接口的提取,测试本身,以及另一个程序集提取,certificateAddIn程序集及其内部对测试可见。 我的问题是 :为什么这不起作用? 我很确定这遵循VSTO测试的普遍接受的做法。 如果以下不再可能,那么应该如何测试VSTO? .NET remoting / IPC是唯一的解决方案吗? ThisAddin.cs public partial class ThisAddin { #region Testing Utilities private AddinHelper _comAddinObject; protected override object RequestComAddInAutomationService() { // This is being called when I debug/run my project, but not when I run the tests return _comAddinObject ?? (_comAddinObject = new […]

如何在OpenOffice中进行简单的邮件合并

我需要在OpenOffice中使用C ++,VBScript,VB.Net或C#通过OLE或本机API进行简单的邮件合并。 有没有好的例子?

使用IFileOperation在副本期间创建目录

使用Stephen Toub的C#( link )的IFileOperation包装器,直到现在一直运行良好。 现在我正在尝试复制以从网络位置收集文件,将每个网络位置收集到其自己的子目录中。 \\FOO\data into C:\gather\Foo_data \\BAR\manage\current进入C:\gather\bar\manage 等等。 问题出在FileOperation.CopyItem 。 必须是因为目标目录还不存在 – IFileOperation将在复制期间创建它,对吗? 我使用了另一个问题的技术,并将Toub的FileOperation.CreateShellItem更改为: private static ComReleaser CreateShellItem( string path ) { try { return new ComReleaser( (IShellItem)SHCreateItemFromParsingName( path, null, ref _shellItemGuid ) ); } catch ( FileNotFoundException ) { IntPtr pidl = SHSimpleIDListFromPath( path ); IShellItem isi = (IShellItem)SHCreateItemFromIDList( pidl, ref _shellItemGuid […]

在C ++ / CLI中是可见的

我正在将C ++转换为C ++ / CLI,并希望将一些托管类公开为COM对象。 在C#中它很容易并且设置[ComVisible]并inheritance自接口(也是ComVisible)完成了这项工作。 但是,作为C ++ / CLI的C ++项目构建不会导出DllRegisterServer。 这是示例项目(从VS 2008中的CLR控制台应用程序项目开始)。 #include “stdafx.h” using namespace System; using namespace System::Runtime::InteropServices; [ComVisible(true)] [Guid(“E3CF8A18-E4A0-4bc3-894E-E9C8648DC1F0”)] [InterfaceType(ComInterfaceType::InterfaceIsDual)] public interface class ITestInterface { void TestMethod(); }; [ComVisible(true)] [Guid(“1514adf6-7cb0-4561-9fbb-b75c0467149b”)] public ref class CliComClass : ITestInterface { public: virtual void TestMethod() { } }; int main(array ^args) { Console::WriteLine(L”Hello World”); return […]

从C#访问COM vtable

有没有办法在C#中访问COM对象的虚方法表以获取函数的地址?

如何将暴露给COM-interop的.NET对象标记为单线程?

在C ++中定义COM可见类时,我可以在头文件中定义支持的线程模型( threading(single) ): [ coclass, default(IComInterface), threading(single), vi_progid(“Example.ComClass”), progid(“Example.ComClass.1”), version(1.0), uuid(“72861DF5-4C77-43ec-A4DC-ED04396F0CCD”) ] 是否有类似的方法在.NET中设置线程模型(例如属性)? 我目前正在定义我的COM类: [Guid(“67155A91-2948-43f5-B07F-5C55CDD240E5”)] [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IComInterface { … } [Guid(“DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB”)] [ClassInterface(ClassInterfaceType.None)] [ProgId(“Example.ComClass”)] public class ComClass : IComInterface { … } – 编辑: 对标记答案的评论非常重要。 似乎告诉RegAsm设置不同的ThreadingModel的唯一方法是编写一个标有[ComRegisterFunction]属性的自定义注册方法。

无法从其他STA线程调用从STAThread创建的COM对象

我是COM的新手,试图了解STA和MTA之间的区别。 我试图创建一个示例,该示例将显示COM可以管理在STA中创建的对象的调用,该对象不是线程安全的。 这里的MyCalcServer类是使用ATL Simple Object创建的。 使用的设置与本文中的相同: 线程模型:公寓 聚合:没有 界面:自定义 MyCalcServer COM对象用于另一个C#项目,它是: class Program { [STAThread] static void Main(string[] args) { MyCOMLib.MyCalcServer instance = new MyCOMLib.MyCalcServer(); string output1; instance.ChangeValue(“Gant”, out output1); Console.WriteLine(output1); Thread t1 = new Thread(() => { while (true) { string output; instance.ChangeValue(“Gant”, out output); Console.WriteLine(output); } }); t1.SetApartmentState(ApartmentState.STA); t1.Start(); // : // also […]

C#4,动态关键字和后期绑定的CreateObject等价物?

如何在不引用库的情况下从程序标识符或ProgID(例如“Word.Application”)在C#4.0中创建动态COM / OLE / ActiveX对象? 在C#3.5中,我必须写一些类似的东西 Type comObjectType = Type.GetTypeFromProgID(progId, true); Activator.CreateInstance(comObjectType); 有没有更简单的方法在C#4.0中执行它,所以我可以将它分配给动态类型的变量(使用动态关键字)?