WCF Com Interop GetRecordInfoFromGuids Returns 旧格式或无效类型库
WCF Com Interop GetRecordInfoFromGuids Returns Old Format Or Invalid Type Library
我在 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);
我得到的return值为
0x80028019 Old format or invalid type library.
这有什么问题吗?
我设法解决了这个问题,当我在搜索 Google 和 none 时发现 3 或 4 个相同的问题有答案,我想我会更新我的,所以它就是那个其实有解决办法
事实证明,字符串数据成员被默认编组为 LPSTR。我从来没有想过这可能是个问题,事实上没有文档说明这可能是个问题。当作为单个对象传递时没有问题。然而,事实证明,当传递这些对象的数组时,字符串成员必须被编组为 BSTR。否则,您会在 GetRecordInfoFromGuids 中收到类型库无效的错误。确实没有文档暗示这就是此调用 returns 类型库无效的原因。我只是通过反复试验才发现问题。
所以上面的代码只需要改成这样
[DataContract]
[Guid("xxx")]
[StructLayout(LayoutKind.Sequential), Serializable]
[ComVisible(true)]
public struct MyData
{
[DataMember]
public int data1;
[DataMember]
[MarshalAs(UnmanagedType.BStr)]
public string data2;
}
现在 GetRecordInfoFromTypeInfo 成功了,我可以成功创建和传递数据了。
我在 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);
我得到的return值为
0x80028019 Old format or invalid type library.
这有什么问题吗?
我设法解决了这个问题,当我在搜索 Google 和 none 时发现 3 或 4 个相同的问题有答案,我想我会更新我的,所以它就是那个其实有解决办法
事实证明,字符串数据成员被默认编组为 LPSTR。我从来没有想过这可能是个问题,事实上没有文档说明这可能是个问题。当作为单个对象传递时没有问题。然而,事实证明,当传递这些对象的数组时,字符串成员必须被编组为 BSTR。否则,您会在 GetRecordInfoFromGuids 中收到类型库无效的错误。确实没有文档暗示这就是此调用 returns 类型库无效的原因。我只是通过反复试验才发现问题。
所以上面的代码只需要改成这样
[DataContract]
[Guid("xxx")]
[StructLayout(LayoutKind.Sequential), Serializable]
[ComVisible(true)]
public struct MyData
{
[DataMember]
public int data1;
[DataMember]
[MarshalAs(UnmanagedType.BStr)]
public string data2;
}
现在 GetRecordInfoFromTypeInfo 成功了,我可以成功创建和传递数据了。