在我的 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。