Tag: com

查找ActiveX组件的所有属性

我试着环顾四周,但由于COM / ActiveX的世界似乎非常令人困惑,因此无法用自己的答案说服自己。 基本上我想知道的是,鉴于GUID,有没有办法知道ActiveX控件公开的所有接口,属性和方法? 我在某个地方读到你只需询问是否有特定的财产。 但是在知道房产之前我该如何询问房产? 我猜IDispatch做了类似的事情,但我无法弄清楚如何使用它。 如果这是有效的,一个小片段,最好是在C#中,可以帮助我更好地理解。 谢谢

无法在C#中实例化COM组件 – 错误80070002

我正在尝试在我的机器上实例化Windows Media Player COM对象: Guid mediaPlayerClassId = new Guid(“47ac3c2f-7033-4d47-ae81-9c94e566c4cc”); Type mediaPlayerType = Type.GetTypeFromCLSID(mediaPlayerClassId); Activator.CreateInstance(mediaPlayerType); // <– this line throws 执行最后一行时,我收到以下错误: System.IO.FileNotFoundException was caught Message=”Retrieving the COM class factory for component with CLSID {47AC3C2F-7033-4D47-AE81-9C94E566C4CC} failed due to the following error: 80070002.” Source=”mscorlib” StackTrace: at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) […]

COMexception80040154创建Excel应用程序时

我正在尝试在没有安装Office的服务器上运行我的应用程序。 using EXCEL = Microsoft.Office.Interop.Excel; … EXCEL.Application app = new EXCEL.Application();//Exception thrown here 代码在我自己的系统上工作正常,但在服务器上它提供以下exception: Unhandled Exception: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {…} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 两个系统都是32位,我在应用程序的exe旁边复制了excel Interop dll。 我还安装了O2010PIA 。 任何铅?

来自PHP的类未注册错误

我们已经创建了一个C#类库程序集,并使其可见,以便能够从PHP调用其方法。 这曾经工作正常,但现在我们想在Windows Server 2008服务器上安装它,我们继续进入错误“Class not registered”。 为了排除任何依赖性问题,我在C#中创建了一个小小的测试类库。 类库是为Any CPU构建的,它是COM可见的(在AssemblyInfo.cs中也将COMVisible设置为true)。 测试类库只包含一个带有一个方法的类。 该类称为TestLib,名称空间也称为TestLib。 该方法称为Test,仅返回一个字符串。 我们所做的是以下内容: – 构建TestLib.dll – 将其复制到Windows Server 2008计算机 – 使用以下命令注册dll:regasm / codebase TestLib.dll – regasm工具返回成功消息 – 在PHP中我们只是尝试创建一个新的COM实例: try { $test = new COM(“TestLib.TestLib”); } catch (Exception $e) { die($e->getMessage()); } 当我们从浏览器或命令行(php -f test.php)调用此测试脚本时,我们在两种情况下都会收到错误“Class not registered” 我也尝试使用gacutil -i将TestLib添加到GAC,但无济于事; 仍然没有注册错误的类。 然后我尝试使用.NET 2.0而不是4.0作为目标框架编译testlibrary,结果相同。 顺便说一下,.NET Framework 4.0安装在服务器上。 有任何想法吗?

在C#中从主线程以外的线程访问COM对象慢

我有一个专有的COM库,它返回一个整数数组(当然是以他们自己的专有格式)。 当我从主UI线程访问此数组时,一切都很顺利并且运行得很快。 当我从另一个线程访问它时,访问速度非常慢。 下面有一些示例代码。 private void test() { ProprietaryLib.Integers ints = ProprietaryLib.GetInts(); int x; for(int i = 0; i < 500; i++) for(int j = 0; j test()).Start(); // Lots of time } 为什么会这样? 我有什么方法可以加快速度吗? 如果我使用多处理而不是multithreading,那么我是否有希望获得良好的性能? (虽然,听起来更复杂。) 更新: 我对下面的答案感到满意,但是想在这里添加一些数据以供参考(我自己和其他人的)。 如上所示在新线程中创建和访问对象,每次访问大约12ns。 据推测,该对象实际上是在主线程上创建的,而慢速是由于从那里封送数据。 如果您在主线程上显式创建数据但在标记为单线程单元的新线程中访问它,则访问时间会更慢,每次访问时间为15 ns。 我想.NET必须有一些额外的开销来保持公寓的美观,尽管它让我担心我不知道那是什么开销。 只有2-3 ns的差异,但不一定要多。 如果您在标记为STA的新线程上创建并访问该对象,则每次访问时间会以.2ns的速度消失。 但这个新线程真的安全吗? 这是我想到的另一个问题的问题。

UI线程阻止调用COM对象的后台线程

我正在开发一个通过第三方COM库与外部设备通信的应用程序。 我试图让所有与设备的通信都通过后台线程来防止通信问题搞砸我的应用程序并摆脱通过在UI线程中进行通信而引入的一些其他复杂性。 问题是每当发生导致主UI线程阻塞的事情(即MessageBox.Show被调用或甚至只是在屏幕上移动窗口)时,与后台线程上的设备的通信也会停止。 是否有任何方法(缺少完全独立的过程)将两个线程分开足够远以至于它们不会相互干扰? (注意,完全相同的代码与一些数学计算,以减慢一点工作得很好,只有当我使用COM库我有问题)

C#COMponent引发的exception消息是否通过interop传递给C ++?

如果我在C#类中实现一个COM接口,它将从C ++模块调用,那么在发生故障的情况下,C#代码应抛出exception; 这将由interop层编组为HRESULT故障代码。 但是,传递给Exception构造函数的任何消息文本(或其他信息)是否也可用于调用C ++代码? 如果是这样,怎样才能获得哪种API方法? 例如,如果在我的C#代码中我throw new ArgumentException(“The email address is invalid”)我将除了我的COM HRESULT为E_INVALIDARG但是我的自定义文本将被编组或者我是否只能查找E_INVALIDARG的文本描述?

Excel中的ErrorMessage

在将Excel ApplicationClass的DisplayAlerts属性设置为false时,我遇到了以下错误的紧急问题。 var excel = new Excel.Application(); excel.DisplayAlerts = false; 我在日志中收到以下错误消息: System.Runtime.InteropServices.COMException (0x800AC472): Exception from HRESULT: 0x800AC472 at Microsoft.Office.Interop.Excel.ApplicationClass.set_DisplayAlerts(Boolean RHS) at Service.Dispose() 显示以下MessageBox http://sofzh.miximages.com/c%23/Nicht-genug-Speicher-fuer-vollstaendige-Anzeige.gif 关于这个案子的任何想法? 关心MacX

“以管理员身份运行”时,实例化COM组件失败并显示“未注册类”

实例化COM Interop对象时: var comObj = new ComComponentClass(); 我得到了COMException : Retrieving the COM class factory for component with CLSID {C343ED84-A129-11D3-B799-0060B0F159EF} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 我以“以管理员身份运行”启动应用程序时出现此错误。 当我正常运行时,不会发生错误。 笔记: 该应用程序是64位应用程序。 COM组件是64位dll中的inproc服务器。 关于我应该从哪里开始调查为什么会出现这种差异的任何想法? 我尝试过的: 我使用Procmon来查看它检查的注册表项。 在这两种情况下,通过检查键HKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32适当的dll HKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32 在这两种情况下,它都会查询密钥HKCR\CLSID\{C343ED84-A129-11D3-B799-0060B0F159EF}并返回NAME NOT FOUND 。 我发现这很奇怪(因为我可以使用regedit.exe找到该密钥。但由于这两种方案之间没有区别,所以它似乎并不重要。

从.NET中的COM对象包装器重定向STDERR输出

我正在尝试在.NET库中使用ImageMagick COM对象(ImageMagickObject)。 这个库旨在从IronRuby中调用,但这并不是那么重要。 我想采用这种方法,因为它适合我现有的调用,当前调用ImageMagick二进制文件作为外部进程。 COM对象将采用与二进制文件相同的参数,但将保存进程创建速度,整体速度提高约5倍。 我唯一的障碍是COM对象的“Compare”方法将其结果返回给STDERR。 这也是二进制文件的一个问题,但很容易将其传回STDOUT,我期待它。 使用COM对象,我从函数返回值中获取结果。 如何将结果从“比较”重定向到字符串缓冲区甚至文件而不是STDERR? 我尝试了以下操作,它确实阻止输出到达STDERR,但它没有按预期写入文件: using ImageMagickObject; … public class ImageMagickCOM { [DllImport(“Kernel32.dll”, SetLastError = true)] public static extern int SetStdHandle(int device, IntPtr handle); private const int STDOUT_HANDLE = -11; private const int STDERR_HANDLE = -12; private ImageMagickObject.MagickImage magickImage = null; private FileStream filestream = null; private StreamWriter streamwriter = […]