我有一个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,并且仍然存在一些使该文件混乱的文件的残余.
我该如何修复或至少进一步诊断此问题?
什么是ISupportErrorInfo接口是什么意思?我理解它有点不知所措.来自MSDN:
此接口可确保错误信息可以正确地在调用链中传播.使用错误处理接口的自动化对象必须实现ISupportErrorInfo.
此方法指示接口是否支持IErrorInfo接口.
HRESULT InterfaceSupportsErrorInfo(
REFIID riid
);
Run Code Online (Sandbox Code Playgroud)
返回S_OK意味着什么InterfaceSupportsErrorInfo?你应该为所有接口返回S_OK吗?一些?
对于"检索具有CLSID {XXXX}的组件的COM类工厂由于以下错误而失败的故障排除过程:.Net中的80080005"错误是什么?澄清一下:我在运行时,在我的XP机器上得到这个,客户端是在管理员帐户下运行的.net代码.{XXXX}指的是我们内部的COM组件之一.
根据我的理解,0x80080005引用"权限被拒绝",但我在哪里检查/更改权限?或者我在这里完全错了,错误来自组件本身,而不是来自Windows COM子系统?
使用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.
因此我认为这是一个框架初始化问题.
有一种简单的方法在Java中使用DirectX吗?特别是DirectX的视频API.
我知道C#可能是一个更自然的选择,但我有狡猾的理由想要做一些如此不正常的事情.
我目前正在使用三段代码:
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) 这是"这是可能的,如果是这样,你能给我一个简单的例子,因为我找不到一个在线的吗?" 有点问题.
我有许多完全独立的(即"令人尴尬的并行")进程,我想使用C#在.NET Framework 4中使用任务并行库并行运行.其中一些过程需要使用可通过COM/OLE自动化访问的软件.
具体来说,有一个Parallel.Foreach()循环将任务从项列表中分开,基本上调用Parallel.Foreach中的不同函数来处理处理(因此其中一些函数使用COM库来工作).
这可能吗?谢谢.
我有一个32 com库,并希望通过64位应用程序使用它的功能,我已经在互联网上搜索并设法得到这个解决方法
HKey_Classes_Root\Wow6432Node\CLSID\[GUID]REG_SZ (string)值.名称应为AppID,数据应与您刚刚搜索的COM对象GUID相同HKey_Classes_Root\Wow6432Node\AppID\REG_SZ (string)值,并将其命名为DllSurrogate.将值保留为空HKey_Local_Machine\Software\Classes\AppID\但它不适用于Windows 7 64位,主要问题是当我执行第6步时我发现密钥已经存在,任何机构都知道为什么?或者我怎样才能克服它?
这里的文件非常简短
我刚刚在Microsoft的guiddef.h头文件中找到了这个:
__inline bool operator==(REFGUID guidOne, REFGUID guidOther)
{
return !!IsEqualGUID(guidOne,guidOther);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何意义!!,或者是某些开发人员那天感觉很可爱?
这是一个非常常见的问题,我决定问这个问题,因为这个问题在今天可能会有不同的答案.希望这些答案有助于理解使用COM对象的正确方法.就个人而言,在对此主题发表不同意见后,我感到非常困惑.
在过去的5年中,我曾经使用COM对象,规则对我来说非常清楚:
你们中的一些人在阅读完最后一行后可能会感到沮丧,这就是我所知道的如何正确创建/发布Com对象,我希望能得到更清晰无误的答案.
以下是我在这个主题上找到的一些链接.他们中的一些人告诉他们需要调用ReleaseComObject而其中一些不需要.
"...在VSTO场景中,您通常不必使用ReleaseCOMObject......."
"...您应该使用此方法释放包含引用的基础COM对象......"
更新:
这个问题被标记为过于宽泛.根据要求,我将尝试简化并提出更简单的问题.