【发布时间】:2013-03-27 03:04:42
【问题描述】:
在我的 VB6 应用程序中,我多次调用我的团队从 Ada 项目(使用 GNATCOM)创建的 COM 服务器。 COM 服务器上基本上有 2 种可用的方法。他们在 VB 中的原型是:
Sub PutParam(Param As Parameter_Type, Value)
Function GetParam(Param As Parameter_Type)
其中 Parameter_Type 是一个枚举类型,用于区分我可以从 COM 服务器放入/获取的许多参数,而“Value”是一个 Variant 类型变量。 PutParam() 接收一个变体,GetParam() 返回一个变体。 (我真的不知道为什么在 VB6 对象浏览器中没有对 COM 服务器接口上的 Variant 类型的引用......)。
该项目的产品多年来一直以这种方式连续使用,在装有 Windows XP SP2 的计算机上,此界面没有任何问题。在装有 WinXP SP3 的计算机上,当尝试将参数设置为“长”类型时,我们会收到错误 0x800706F7“存根收到错误数据”。
有人知道是什么原因造成的吗? COM 服务器仍在使用 SP2 的系统中构建。在带有 SP3 的系统上构建它应该有什么不同吗? (就像我们在 X64 系统中为 X64 构建时一样)。
导致问题的调用之一如下(更改了一些 var 名称):
Dim StructData As StructData_Type
StructData.FirstLong = 1234567
StructData.SecondLong = 8901234
StructData.Status = True
ComServer.PutParam(StructDataParamType, StructData)
其中StructData_Type的定义是:
Type StructData_Type
FirstLong As Long
SecondLong As Long
Status As Boolean
End Type
(以下已在问题首次发布后添加)
IDL中COM服务器接口的原语调用定义如下:
// Service to receive data
HRESULT PutParam([in] Parameter_Type Param, [in] VARIANT *Value);
//Service to send requested data
HRESULT GetParam([in] Parameter_Type Param, [out, retval] VARIANT *Value);
我要传递的结构的定义是:
struct StructData_Type
{
int FirstLong;
int SecondLong;
VARIANT_BOOL Status;
} StructData_Type;
奇怪的是,这里的定义使用“int”作为 FirstLong 和 SeconLong 的类型,当我检查 VB6 对象资源管理器时,它们的类型是“Long”。顺便说一句,当我从 COM 服务器中提取 IDL(使用特定实用程序)时,这些参数被定义为 Long。
更新:
我已经使用为 Windows 7 编译的 COM 服务器版本(不同版本的 GNAT,相同的 GNATCOM 版本)测试了相同的代码,它可以工作!我真的不知道这里发生了什么。我将继续尝试找出 WinXP SP3 上的问题,但很高兴知道它在 Win7 上有效。如果您有类似的问题,最好尝试迁移到 Win7。
【问题讨论】:
-
我实际上并没有在我的界面上使用 BSTR...在这种特定情况下,它只是一个具有两个 Long 变量和一个 Integer 的复杂类型(结构)...这个问题只发生长变量。
-
这是 VB6 特有的:您在从 C++ 客户端或脚本客户端进行调用时遇到问题吗?此外,我认为有关您的 COM 组件的一些详细信息可能会有所帮助。至少定义接口。
-
上面增加了一些接口信息。我还没有从其他客户那里尝试过。我将尝试从 C++ 客户端进行此调用...如上所述,我的服务器是用 Ada 编写的,并使用带有 GNATCOM(COM 库)的 GNAT 构建。
-
"...为什么在 VB6 对象浏览器中没有对 Variant 类型的引用..." 这是因为
Variant是 VB 中的默认类型。 “...这里的定义使用'int' 作为 FirstLong 的类型... [并且在] 对象资源管理器中,它们的类型为'Long'...” 如果您使用 MIDL 编译您的 IDL,那没关系。在 32 位平台上,int与 MIDL 的long同义。如果您不使用 MIDL 编译,那么我们需要更多详细信息。 msdn.microsoft.com/en-us/library/windows/desktop/…
标签: com vb6 windows-xp ada windows-xp-sp3