WCF Com Interop GetRecordInfoFromGuids返回旧格式或无效类型库

时间:2015-07-13 15:12:00

标签: c# c++ com-interop safearray

我在用C#定义的WCF服务中有一个结构为

   [DataContract]
   [StructLayout(LayoutKind.Sequential), Serializable]
   [ComVisible(true)]
   public struct MyData
   {
      [DataMember]
      public int data1;

      [DataMember]
      public string data2;
   }

从MFC应用程序我试图创建此结构的SafeArray。当像这样调用GetRecordInfoFromGuids时

hr = GetRecordInfoFromGuids(LIBID_MyLib, 1, 0, LOCALE_USER_DEFAULT, __uuidof(MyData), &pRI);

我得到了

的返回值
0x80028019 Old format or invalid type library. 

这有什么问题?

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题,因为我发现有3到4个相同的问题正在搜索谷歌而且没有人有答案,我想我会更新我的,所以它实际上是一个解决方案。

事实证明,字符串数据成员默认编组为LPSTR。我从未想过这可能是一个问题,事实上没有文件说明它可能存在。作为单个对象传递时没有问题。但是,事实证明,当传递这些对象的数组时,必须将字符串成员编组为BSTR。否则,您会在GetRecordInfoFromGuids中收到类型库无效的错误。实际上没有文档暗示这就是为什么这个调用返回类型库无效的原因。我发现问题只是通过反复试验。

所以上面的代码只需要改成这个

   [DataContract]
   [Guid("xxx")]
   [StructLayout(LayoutKind.Sequential), Serializable]
   [ComVisible(true)]
   public struct MyData
   {
      [DataMember]
      public int data1;

      [DataMember]
      [MarshalAs(UnmanagedType.BStr)]
      public string data2;
   }

现在GetRecordInfoFromTypeInfo成功,我可以成功创建和传递数据。