我正在设计一个通信中间件,用于在Ada中有一个模块的应用程序和C++中的许多模块,它们传递传递参数(标量值)和结构.该应用程序在MS Windows XP和Windows 7中运行,C++部分正在MSVC++ 2008中开发,Ada部分正在使用GPS/GNAT开发.Ada版本是1995年,但我们正处于编译器迁移(更新版本的GPS/GNAT)的中间,可能会使用更新的Ada规范.
中间件是用C++编写的,我想使用包含在模块之间传递的所有类型的union类型,因此我不需要为系统上使用的每种类型指定一个put/get函数.
问题是,C++联盟是否与Ada变体记录二进制兼容?换句话说,如果我将C++联合传递给Ada代码,它是否能够将其作为Variant记录读取?(反之亦然)
我认为为此可能需要进行一些调整......(例如:C++联盟不包含描述其内容的成员,而Ada变体记录也是如此)
在我的VB6应用程序中,我多次调用我的团队从Ada项目创建的COM服务器(使用GNATCOM).COM服务器上基本上有两种方法可用.他们在VB中的原型是:
Sub PutParam(Param As Parameter_Type, Value)
Function GetParam(Param As Parameter_Type)
Run Code Online (Sandbox Code Playgroud)
其中Parameter_Type是一个枚举类型,它区分了我可以放入/获取COM服务器的许多参数,'Value'是Variant类型变量.PutParam()接收变量,GetParam()返回变量.(我真的不知道为什么在VB6对象浏览器中没有引用COM服务器接口上的Variant类型...).
这个项目的产品已经连续多年使用,在Windows XP SP2的计算机上没有任何问题.在使用WinXP SP3的计算机上,当尝试将参数设置为"Long"类型时,我们得到错误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)
Run Code Online (Sandbox Code Playgroud)
StructData_Type的定义是:
Type StructData_Type
FirstLong As Long
SecondLong As Long
Status As Boolean
End Type
Run Code Online (Sandbox Code Playgroud)
(首次发布问题后添加了以下内容)
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);
Run Code Online (Sandbox Code Playgroud)
我试图传递的结构的定义是:
struct StructData_Type …Run Code Online (Sandbox Code Playgroud) 我的任务是为分布式应用程序设计一个新的接口(在一台计算机上运行的多个进程,而不是物理上分布的),它由许多用C++/OpenGL编写的图形面板模块和用Ada编写的单个模块组成.
模块共享参数形式的信息(标量非结构化信息,例如:整数,字符串,浮点数等).我打算设计一个基于异步套接字的组件(以下我称之为"接口组件"或IC),由每个模块基于Boost :: Asio库链接,并带有两个简单的"客户端"原语:
Put([ParameterName], [DestinationModule], [Payload], [Type])
Get([ParameterName], [Sourcemodule], [Payload])
Run Code Online (Sandbox Code Playgroud)
ParameterName:指定唯一参数名称
DestinationModule/SourceModule:在系统中为模块添加
有效负载:实际数据
类型:标识传递参数类型的字符串或值
每个这些原语在服务器端由两个相应的函数处理(在IC上):
//No function parameters shown here as I don't know
//exactly how I'm going to do this
ProcessPutRequest()
ProcessGetRequest()
Run Code Online (Sandbox Code Playgroud)
因为传入命令的处理将由IC启动,所以我打算使用将传递给上述函数的函数处理程序.这样,每个模块负责的每个程序员都可以处理传入的命令并在他自己的代码上执行必要的类型转换.
问题是......这在阿达可能吗?我知道可以用C++导入函数并从Ada程序调用它btu是否可以将函数处理程序从Ada传递给C++组件?
(一个侧面问题是:您对实现此接口的更好方法有什么建议吗?)
ada ×3
c++ ×2
asynchronous ×1
boost-asio ×1
com ×1
record ×1
sockets ×1
unions ×1
variant ×1
vb6 ×1
windows-xp ×1