0

我在 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. 

这有什么问题?

4

1 回答 1

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 成功了,我可以成功地创建和传递数据。

于 2015-07-14T12:45:24.207 回答