私の VB6 アプリケーションでは、私のチームが (GNATCOM を使用して) Ada プロジェクトから作成した COM サーバーに対していくつかの呼び出しを行います。COM サーバーでは、基本的に 2 つの方法を使用できます。VB でのプロトタイプは次のとおりです。
Sub PutParam(Param As Parameter_Type, Value)
Function GetParam(Param As Parameter_Type)
ここで、Parameter_Typeは列挙型で、COM サーバーとやり取りできる多くのパラメーターを区別し、「値」はバリアント型変数です。PutParam() はバリアントを受け取り、GetParam() はバリアントを返します。(VB6 オブジェクト ブラウザで、COM サーバー インターフェイスのバリアント型への参照がない理由がよくわかりません...)。
このプロジェクトの製品は、Windows XP SP2 を搭載したコンピューター上で、このインターフェイスで何の問題もなく、この方法で何年も継続して使用されてきました。WinXP SP3 を搭載したコンピューターでは、「Long」タイプのパラメーターを入力しようとすると、エラー 0x800706F7「スタブが不正なデータを受信しました」が発生します。
何がこれを引き起こしているのか、誰にも手がかりがありますか? COM サーバーは、SP2 を適用したシステムにまだ組み込まれています。SP3 を使用してシステム上にビルドすると、違いが生じるはずですか? (X64 システムで X64 用にビルドするときのように)。
問題の原因となっている呼び出しの 1 つは次のとおりです (一部の変数名を変更)。
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;
ここでの定義が FirstLong と SeconLong の型として「int」を使用していて、VB6 オブジェクト エクスプローラーを確認すると、「Long」と型付けされているのが奇妙であることがわかりました。ところで、(特定のユーティリティを使用して) COM サーバーから IDL を抽出すると、これらのパラメータは Long として定義されます。
アップデート:
Windows 7 用にコンパイルされたバージョンの COM サーバー (異なるバージョンの GNAT、同じ GNATCOM バージョン) で同じコードをテストしたところ、動作しました。ここで何が起こったのかよくわかりません。WinXP SP3 での問題の特定を続けますが、Win7 でも動作することを知ってよかったです。同様の問題がある場合は、Win7 への移行をお試しください。