4

我正在尝试在我目前正在开发的 .net 应用程序中使用 PCAnywhere 的 Ole 自动化(VS 2010,c#)。PCA 12.5 附带了几个 tlb 文件,当我尝试通过 VS 添加作为引用时,我都收到一个错误,即“无法添加对 'E:\Dev\PcaOle\awrem32.tlb' 的引用”。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。',所以我所做的是使用 tlbimp.exe 生成互操作程序集并设法将创建的 DLL 作为引用导入没有问题。好的。这是我到目前为止的一些代码:

Thread pcat = new Thread(delegate()
{
    CRemoteDataManagerClass mng = new CRemoteDataManagerClass();
    RemoteDataExClass data = null;
    data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
    if (data == null)
        data = (RemoteDataExClass)mng.CreateObjectEx("temp.chf");
    data.ConnectionType = "TCP/IP";
    data.PhoneNumber = host.IP;
    data.AutoLoginName = host.Nombre.StartsWith("WS") ? "usrwksvc" : "admonadn";
    data.AutoDomain = "dom" + actual.numec.PadLeft(4, '0');
    data.WriteProtection = false;
    data.WriteObject(null);
    AWREM32.Document doc = new AWREM32.Document();
});
pcat.SetApartmentState(ApartmentState.STA);
pcat.Start();
pcat.Join();

CRemoteDataManagerClass、RemoteDataExClass 和 AWREM32.Document 是程序集中的类。

所以我在第 5 行 ( ) 得到一个异常,data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);它说明了以下内容:

无法将“winawsvr.CRemoteDataManagerClass”类型的 COM 对象转换为接口类型“winawsvr.IRemoteDataManager”。此操作失败,因为 IID 为“{82A1A806-8BA9-11CF-B95F-00A02412C812}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:Interfaz 不兼容(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))。

我在这里能错过什么?也许与 COM 组件的注册方式有关?它们以前是在我什至尝试使用 regasm.exe 注册它们之前,只有 CLSID 在它们中有 LocalServer32 键。在我运行 regasm.exe 之后,这创建了两个,我相信:InprocHandler32 和 InprocServer32。我之前和之后都有同样的例外。

我在某处读到需要在设置为 STA 单元状态的线程中运行调用代码。所以我做了。还是没有变化。

我注意到的另一件事是,当我针对失败类所在的互操作程序集运行 ildasm.exe 时,我可以在 IRemoteDataManager 中看到以下行:.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 38 32 41 31 41 38 30 36 2D 38 42 41 39 // ..$82A1A806-8BA9 ...。带有 TLB 的 IRemoteDataManager 的 GUID82A1A806-8BA9-11CF-B95F-00A02412C812与异常中提到的 GUID 相同。这个 GUID 的前两个部分位于我从 ildasm 中提到的那一行(我猜其余部分只是为了显示问题而删减的),所以那里的一切似乎都很好。

我尝试使用 CRemoteDataManager(它是实现 IRemoteDataManager 的接口)而不是 CRemoteDataManagerClass,但同样的交易。在这两种情况下,异常总是提到 CRemoteDataManagerClass 反正。从我在 ildasm 中看到的情况来看,CRemoteDataManagerClass 实现了 CRemoteDataManager 和 IRemoteDataManager。也许 QueryInterface 在两者之一或其他方面都失败了。

我不知道。我显然到处都是。

我还研究了互操作日志记录,以了解 QueryInterface 失败的确切原因,但我发现的只是有关如何在 .netcompactframework 上执行此操作的文档。

4

1 回答 1

2

在我看来

data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);

可能有问题。我相信 (RemoteDataExClass) 试图在调用 .RetrieveObjectEx 之前将 mng 转换为其类型。这可能会给您带来错误。另一种选择可能是其中一个类对象不喜欢 New 运算符。我注意到在各种情况下,这些库提供了会产生错误的 new 运算符,但还有其他类具有某种 Create 函数。使用那些可能会获得您需要进行检索的 Created 类。

于 2010-09-07T17:42:33.213 回答