标签: com

为什么regasm.exe使用错误的GUID注册我的c#程序集?

我有一个ac#assembly,我正在通过COM从Delphi(win32 native)应用程序调用它.

这适用于我测试过的所有机器,除了一台.

问题是Delphi应用程序在尝试创建COM对象时获得"Class not registered".

现在,当我查看下面的注册表时HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID,列出的GUID与AssemblyInfo.cs中的程序集Guid不同.它应该是相同的 - 它在安装它的所有其他计算机上是相同的.

我试过了regasm /unregister delphitocsharp.dll,删除了注册表项.然后如果我这样做regasm delphitocsharp.dll,注册表键返回,但GUID与之前相同(即错误),Delphi仍然获得"Class not registered".

工作机器上的DelphiToCSharp.dll与非工作机器上的版本完全相同(通过md5验证).

我能想到的只是之前注册了一个旧版本的dll,并且仍然存在一些使该文件混乱的文件的残余.

我该如何修复或至少进一步诊断此问题?

.net c# delphi com regasm

11
推荐指数
1
解决办法
6140
查看次数

ISupportErrorInfo的实现 - 这是什么意思?

什么是ISupportErrorInfo接口是什么意思?我理解它有点不知所措.来自MSDN:

此接口可确保错误信息可以正确地在调用链中传播.使用错误处理接口的自动化对象必须实现ISupportErrorInfo.

此方法指示接口是否支持IErrorInfo接口.

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);
Run Code Online (Sandbox Code Playgroud)

返回S_OK意味着什么InterfaceSupportsErrorInfo?你应该为所有接口返回S_OK吗?一些?

com error-handling

11
推荐指数
1
解决办法
3360
查看次数

由于以下错误,检索具有CLSID {XXXX}的组件的COM类工厂失败:80080005

对于"检索具有CLSID {XXXX}的组件的COM类工厂由于以下错误而失败的故障排除过程:.Net中的80080005"错误是什么?澄清一下:我在运行时,在我的XP机器上得到这个,客户端是在管理员帐户下运行的.net代码.{XXXX}指的是我们内部的COM组件之一.

根据我的理解,0x80080005引用"权限被拒绝",但我在哪里检查/更改权限?或者我在这里完全错了,错误来自组件本身,而不是来自Windows COM子系统?

.net com interop

11
推荐指数
1
解决办法
5万
查看次数

无法从VBA实例化用C#编写的COM对象(VB6 ok)

使用VS 2008,这是我的COM对象

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestCom
{    
    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("Test9.COMINT")]
    public class TestComClass  
    { 
        public void Init(string userid, string password)
        {
            MessageBox.Show(string.Format("{0}/{1}", userid, password));
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我构建它并在生产机器上注册如下

REGASM /CODEBASE TESTCOM.DLL
Run Code Online (Sandbox Code Playgroud)

从一个简单的VB6应用程序,这工作正常

Private Sub Form_Load()
  Dim o As Object
  Set o = CreateObject("Test9.COMINT")
  o.Init "A", "B" 
End Sub
Run Code Online (Sandbox Code Playgroud)

这个完全相同的代码从Excel中的VBA调用

"自动化错误"(0x80131700)

一切都在开发机器上运行良好,而不是只安装了.NET和MS Office的生产机器上.

更新

我认为这与.NET框架在Excel下运行时未正确初始化有关.如果我使用Filemon,我可以看到它跳过寻找MSCORWKS.DLL.当我从VBScript调用相同的对象时,它发现MSCorwks.dll很好.

当我打电话CorBindToCurrentRunTime从VBA,试图强行加载CLR,有趣的是我得到确切同样的HRESULT (0x80131700),当我做CreateObject()在VBA.

因此我认为这是一个框架初始化问题.

.net c# com vba com-interop

11
推荐指数
2
解决办法
1万
查看次数

DirectX on Java可能吗?

有一种简单的方法在Java中使用DirectX吗?特别是DirectX的视频API.

我知道C#可能是一个更自然的选择,但我有狡猾的理由想要做一些如此不正常的事情.

java com directx video

11
推荐指数
1
解决办法
3万
查看次数

通过已注册的TLB从python访问未注册的COM对象

我目前正在使用三段代码:

  • 一个闭源应用程序(Main.exe)
  • 作为dll实现的闭源VB COM对象(comobj.dll)
  • 我在Python中开发的代码

comobj.dll托管一个COM对象(比方说'MainInteract'),我想从Python中使用它.我已经可以在IronPython中完美地使用这个对象,但由于其他要求,我需要从常规Python中使用它.我相信这里最好的方法是使用win32com,但我根本无法取得任何进展.

首先,一些有效的IronPython代码:

import clr
import os
import sys

__dir__ = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, __dir__)
sys.path.append(r"C:\Path\To\comobj.dll") #This is where the com object dll actually is

clr.AddReferenceToFileAndPath(os.path.join(__dir__, r'comobj_1_1.dll')) #This is the .NET interop assembly that was created automatically via SharpDevelop's COM Inspector

from comobj_1_1 import clsMainInteract

o = clsMainInteract()
o.DoStuff(True)
Run Code Online (Sandbox Code Playgroud)

现在,我在常规Python中尝试的代码:

>>> import win32com.client
>>> win32com.client.Dispatch("{11111111-comobj_guid_i_got_from_com_inspector}")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File …
Run Code Online (Sandbox Code Playgroud)

python com interop assemblies win32com

11
推荐指数
3
解决办法
1万
查看次数

.NET 4任务并行库可以使用COM对象吗?

这是"这是可能的,如果是这样,你能给我一个简单的例子,因为我找不到一个在线的吗?" 有点问题.

我有许多完全独立的(即"令人尴尬的并行")进程,我想使用C#在.NET Framework 4中使用任务并行库并行运行.其中一些过程需要使用可通过COM/OLE自动化访问的软件.

具体来说,有一个Parallel.Foreach()循环将任务从项列表中分开,基本上调用Parallel.Foreach中的不同函数来处理处理(因此其中一些函数使用COM库来工作).

这可能吗?谢谢.

c# com ole .net-4.0 task-parallel-library

11
推荐指数
1
解决办法
3970
查看次数

在64位应用程序上使用com 32位库

我有一个32 com库,并希望通过64位应用程序使用它的功能,我已经在互联网上搜索并设法得到这个解决方法

  1. 在下面找到您的COM对象GUID HKey_Classes_Root\Wow6432Node\CLSID\[GUID]
  2. 找到后添加一个新REG_SZ (string)值.名称应为AppID,数据应与您刚刚搜索的COM对象GUID相同
  3. 在下添加一个新密钥 HKey_Classes_Root\Wow6432Node\AppID\
  4. 新密钥应该与com对象GUID相同
  5. 在刚添加的新密钥下,添加一个新REG_SZ (string)值,并将其命名为DllSurrogate.将值保留为
  6. 在下创建一个新密钥 HKey_Local_Machine\Software\Classes\AppID\

但它不适用于Windows 7 64位,主要问题是当我执行第6步时我发现密钥已经存在,任何机构都知道为什么?或者我怎样才能克服它?

这里的文件非常简短

c++ com com+

11
推荐指数
1
解决办法
787
查看次数

逻辑!! 没什么

我刚刚在Microsoft的guiddef.h头文件中找到了这个:

__inline bool operator==(REFGUID guidOne, REFGUID guidOther)
{
    return !!IsEqualGUID(guidOne,guidOther);
}
Run Code Online (Sandbox Code Playgroud)

是否有任何意义!!,或者是某些开发人员那天感觉很可爱?

c c++ com

11
推荐指数
2
解决办法
222
查看次数

截至今天,使用COM对象的正确方法是什么?

这是一个非常常见的问题,我决定问这个问题,因为这个问题在今天可能会有不同的答案.希望这些答案有助于理解使用COM对象的正确方法.就个人而言,在对此主题发表不同意见后,我感到非常困惑.

在过去的5年中,我曾经使用COM对象,规则对我来说非常清楚:

  1. 在代码行中使用单个句点.使用多个句点在场景后面创建无法明确释放的临时对象.
  2. 不要使用foreach,而是使用for循环,并在每次迭代时释放每个项目
  3. 不要调用FInalReleaseComObject,而是使用ReleaseComObject.
  4. 不要使用GC释放COM对象.GC意图主要用于调试用法.
  5. 以与创建对象相反的顺序释放对象.

你们中的一些人在阅读完最后一行后可能会感到沮丧,这就是我所知道的如何正确创建/发布Com对象,我希望能得到更清晰无误的答案.

以下是我在这个主题上找到的一些链接.他们中的一些人告诉他们需要调用ReleaseComObject而其中一些不需要.

"...在VSTO场景中,您通常不必使用ReleaseCOMObject......."

"...您应该使用此方法释放包含引用的基础COM对象......"

更新:

这个问题被标记为过于宽泛.根据要求,我将尝试简化并提出更简单的问题.

  1. 使用COM对象或调用GC是否正确时,是否需要ReleaseComObject?
  2. VSTO方法是否会改变我们以前使用COM对象的方式?
  3. 我写的上述哪些规则是必需的,哪些是错的?还有其他人吗?

.net c# vb.net com excel

11
推荐指数
1
解决办法
2041
查看次数