Tag: com

从/向C#(非C)COM组件加载和传递JScript数组

我已经看过jscript数组的教程,但还没有看到它。 我看到类似的问题,但涉及Win32代码而不是.NET。 想知道,如何在JScript和C#COM组件之间来回传递数组? 例如,我在C#COM中定义了两个属性,它们返回字符串和整数数组: string[] HeaderLines { get; set; } int[] ImagePixels { get; set; } 在我的test.js文件中: … var T = new ActiveXObject(“Imager.Reader”); … var headerLines = T.HeaderLines; WScript.StdOut.WriteLine(“First HeaderLine:” + headerLines[0]); var pixels = T.ImagePixels; WScript.StdOut.WriteLine(“First Pixel: ” + pixels[0]); 错误是写出headerLines [0]的地方:C:\ temp \ test.js(12,1)Microsoft JScript运行时错误:’headerLines.0’为null或不是对象 如果我删除test.js中的headerLines,那么我得到这个错误(基本上相同但是对于整数数组):C:\ temp \ test.js(12,1)Microsoft JScript运行时错误:’pixels.0’是null或不是对象 我可以从非数组属性获得结果,也可以将值传递给其他方法,但不能传递给数组。 我还需要将字符串和整数数组传递到我的C#COM组件中定义的方法中: bool […]

Interop COM(-isch)接口封送会在简单调用时导致AccessViotlationException

我正在尝试为本机C ++插件标准编写托管互操作库。 此本机C ++库使用C​​OM兼容的接口设计。 但是,它不会做任何类注册的东西。 与COM一样,所有接口都派生自IUnknown(称为FUnknown,但无论如何都是相同的3种方法)。 我编写了一个简单的C ++控制台应用程序,它可以加载我的托管测试插件,并通过导出的方法检索初始(根)接口(对象工厂模式 – 与com类似)。 我使用第三方DllExport代码属性实现 – 这似乎工作正常。 C ++测试应用程序使用LoadLibrary / GetProcAddress并成功检索对该接口的引用。 我可以在托管导出函数中设置断点,并按预期命中。 然后C ++测试应用程序在IUnknown(部分)接口上调用AddRef,它返回2 – 正如预期的那样。 请注意,我的托管接口定义(counter-part)不是从IUnknown派生的 – 或者包含这些方法。 我想说这意味着托管编组魔法已经介入并提供了CCW。 然后C ++测试应用程序调用工厂接口上的一个简单方法 – 一个只返回一个int32 – 并且也到达托管实现(断点被命中),但是当该方法返回时抛出一个AccessViolationException – 在托管中的某处 – 无管理的过渡。 class IPluginFactory : public FUnknown { public: // removed other methods before and after this one virtual int32 PLUGIN_API […]

如何在C中使用tlb文件?

tlb文件(使用regasm)是由dll(使用c#代码)制作的,我可以使用#import在c ++中使用它。 一切都很好。 有没有办法,我可以在C语言中使用它吗? 我刚发现#import是c ++特有的。 那么,有人可以告诉我如何在我的C程序中使用它? 我的主要目的是在我的C程序中使用C#开发的COM DLL。 谢谢&Rgds,~calvin

无注册在64位COM dll和C#/ .Net应用程序之间互操作

我试图在64位COM DLL和C#应用程序之间获得免注册COM互操作。 在我之前的一个问题的答案中 ,我得到了帮助,这使我能够在C#的64位COM dll上成功调用HelloWorld方法。 但是,这只能通过使用regsrv32.exe全局注册COM dll来实现。 基于对相关问题的这个答案 ,我认为我需要将COM dll的引用上的Isolated标志设置为true。 但是,这会导致以下构建错误: Problem isolating COM reference ‘ComLibInteropLib’: No registered classes were detected for this component. 关于MSDN社交问题的答案似乎表明,如果可以编译32位版本的dll,就可以解决这个问题。 但是,我的COM互操作库需要链接到一个“普通”的C ++ dll,我没有源代码,只能用于x64。 所以我的问题是:如何在64位COM dll和C#应用程序之间启用Isolated标志(或以其他方式并行工作)? 我很高兴在我的机器或其他开发人员的机器上使用regsrv32.exe,但我们无法在最终应用程序必须运行的生产机器上注册任何COM dll。

在C#中使用SHAssocEnumHandlers

我正在努力在C#中调用WinAPI SHAssocEnumHandlers。 using System; using System.Runtime.InteropServices; namespace AssocHandlerTest { [Flags] public enum ASSOC_FILTER { ASSOC_FILTER_NONE = 0x0, ASSOC_FILTER_RECOMMENDED = 0x1 }; [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid(“F04061AC-1659-4a3f-A954-775AA57FC083”)] public interface IAssocHandler { int GetName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetUIName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszPath, [Out] out int pIndex); int IsRecommended(); int MakeDefault([In, MarshalAs(UnmanagedType.LPWStr)] […]

在非托管C ++程序中实现C#DLL COM文件

这是我的另一个问题,也引用了这个问题作为参考: 如何从Un-managed C ++调用托管C ++方法 我已经成功创建了一个C#COM文件。 现在我需要一个关于如何在非托管C ++中实现它的简单解释。 我遵循这个例子,但c ++部分很弱。 http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C 这是我的COM文件 using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; using System.Text; namespace cSharpRiJHarn { [Guid(“ED1483A3-000A-41f5-B1BC-5235F5897872”)] public interface DBCOM_Interface { [DispId(1)] String encrypt(string s); [DispId(2)] String decrpyt(string s); } [Guid(“A6BCEC1D-B60C-4c97-B9AD-1FE72642A9F8”), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface DBCOM_Events { } [Guid(“7C13A8C6-4230-445f-8C77-0CA5EDECDCB5”), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(DBCOM_Events))] public class RijndaelLink : DBCOM_Interface { […]

.NET是否定义了常见的HRESULT值?

我在C#中创建一个COM类,它将从非托管C ++中调用。 我想使用ThrowExceptionForHR,但我不想硬编码HRESULT数值。 我原以为在.Net某处会有一些常见的HRESULT值? 换句话说,在哪里可以找到映射到HRESULT值的命名符号以传递给ThrowExceptionForHR ? 更新: MS在此页面中讨论它: 管理代码中的HRESULT信息 。 它们引用了VSConstants类Microsoft.VisualStudio.VSConstants但是当我尝试使用它时,它声称命名空间不存在。

调用C#COM对象

好的,我创建了ac#dll,使其所有接口和方法都是ComVisible(true)。 使用gacutil将其添加到GAC,然后使用regasm注册它并创建类型库tlb文件。 现在我有另一个c#项目,我想调用该com对象,我该怎么做? 导入com对象然后使用其调用的代码大致是什么样的?

将IUnknowns的SAFEARRAY转换/转换为可迭代的接口指针数组

我在C#中有以下接口,其中一个具有相同名称的类(没有我)实现它。 [ComVisible(true)] [Guid(“B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E”)] public interface IOrder { long GetQuantity(); long GetOrderType(); long GetPositionType(); } 公共类Order的实现:IOrder只有三个私有字段和一个带有3个参数的构造函数。 在其他地方,我有以下方法,结果我想在C ++非托管代码中工作,通过COM和.tlb / .tlh文件传输。 public ScOrder[] GetOrders() { //constant return value for simplicity return new Order[] { new Order(1, 2, 3), new Order(4, 5, 6) }; } 我已经设法使用C#托管代码在C ++非托管代码之间进行基础工作。 但是类arrays被certificate是一个不同的挑战…… 我承认,对我来说,COM是新的,残酷的混淆和C ++很久以前被遗忘……但是我正在开发这两个库,所以我不放弃; 我希望C ++ DLL作为一些程序和我的C#代码之间的代理。 澄清:我既不使用MFC也不使用ATL。 我在C ++代码中使用#import来获取C#生成的接口和类指针以及其他我还不太了解的COM内容。 经过一个小时的研究,我只是去这里寻求帮助>。< 以下是我想要实现的C […]

如何在不生成exception的情况下检查COM属性或方法是否存在?

我正在研究一些遗留代码,它们创建包含属性和/或方法名称的字符串列表,然后尝试将这些属性或方法应用于COM对象。 COM对象的属性或方法不保证存在,它可以是属性或方法我不知道哪个。 目前,如果某个属性或方法不存在,则会将其作为COMexception捕获。 这导致性能不佳。 我试图找到一种方法来检查COM对象中是否存在属性或方法而不生成exception,以便在尝试应用它之前我可以检查它是否存在。 使用GetType返回类型System.com_object。 在System.com_object上使用GetProperty不起作用,因为这是确切的运行时类型,而不是它的派生类型。 相反,我必须使用InvokeMember,如果该成员不存在则会创建exception。 有没有人有更好的方法这样做? 我目前正在使用.NET 3.5 。 迁移到.NET 4目前不是一个选项,但如果新语言function提供了解决问题的更好方法,我仍然对.NET 4中的解决方案感兴趣。 public static bool CheckIfComPropertyOrMethodExists(T1 objectToCheck, string propertyOrMethodName) { if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) { return false; } { return true; } } public static bool CheckIfComPropertyExists(T1 objectToCheck, string propertyName) { return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, […]