我使用以下命令创建一个COM对象(来自本机代码)CoCreateInstance:
const
CLASS_GP2010: TGUID = "{DC55D96D-2D44-4697-9165-25D790DD8593}";
hr = CoCreateInstance(CLASS_GP2010, nil, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IUnknown, out unk);
Run Code Online (Sandbox Code Playgroud)
实际上,我在Delphi中,这意味着我调用了辅助函数:
CreateComObject(CLASS_GP2010);
Run Code Online (Sandbox Code Playgroud)
大部分时间这个功能都成功了.但有时,在同一个可执行文件中,在同一进程中,调用CoCreateInstance失败的原因是:
Unspecified error (0x80004005 = E_FAIL)
Run Code Online (Sandbox Code Playgroud)
再次调用该函数可能会成功,或者可能会失败.没有(明显的)押韵或理由.
如果这是一个正常的 COM DLL,我写,我就开始把OutputDebugString在DLL_ATTACH,当有人试图打电话DllGetClassObject,我会确认COM是正确加载我的DLL,并且它被正确要求被实例化的类.
不幸的是,它不是COM dll; 它是一个.NET程序集dll.COM子系统并不是简单地 "加载"我的dll.相反,COM被指示加载mscoree.dll:
HKEY_CLASSES_ROOT
CLSID
{DC55D96D-2D44-4697-9165-25D790DD8593}
InprocServer32
@default = mscoree.dll
Run Code Online (Sandbox Code Playgroud)
并mscoree.dll导出所需的GetClassObject功能.那mscoree.dll个人回来了E_FAIL,不是我.故障永远不会发生在我的开发机器上,但始终在客户机器上间歇性地失败.
问题是,因为mscoree.dll返回的是E_FAIL(而不是任何有用的):我如何告诉我问题是什么?
例如,似乎唯一遇到故障的客户(除了是唯一大量使用COM对象的客户)恰好在Windows XP上.也许他们遇到了.NET框架中的已知错误(版本4之前),您无法在同一进程中加载不同版本的.NET运行时 …
我在ASP.net,c#中开发了一个Web服务,并在IIS上托管,由vba客户端使用.下载了Office 2003 Web Services 2.01工具包后,我遇到了成功创建所需代理类的问题(许多用户在线记录),并决定创建一个.net DLL库.我创建了一个库,它引用了Web服务并将其中一个方法暴露给c#中的公共函数.
我现在有三个问题:
如何在VBA中引用dll类?我试图去工具 - >引用并浏览到dll位置,但是我收到错误"无法添加对指定文件的引用".磁盘上是否有特定位置我必须复制.dll?
我还可以复制dll文件旁边的dll.config文件,以便在那里使用端点URL吗?
由于要调用的方法是接受一个对象(由各种成员和几个List <>成员组成,这些如何在VBA代码中实现?
我在.NET 3.5 C#WinForms应用程序中有一个类,它有五种方法.每种方法都使用不同的C++ COM接口集.我用Marshal.FinalReleaseCOMObject清理这些COM对象.此代码在此.NET平台上运行正常,没有任何问题.但是,当我将此应用程序移动到.NET 4.0时,我开始在这些方法中的一个中从我ICOMInterface1向其转换变量的行中获取此错误ICOMInterface2,即:
ICOMInterface1 myVar= obj as ICOMInterface2;
Run Code Online (Sandbox Code Playgroud)
无法使用已与其基础RCW分离的COM对象.
如果我删除使用的行Marshal.FinalReleaseCOMObject,我不会收到此错误.
我在这里错过了什么?如何从.NET 4.0平台上的内存中清除这些非托管COM对象?