0

正常に動作している WCF サービスを開発しました。それから、このガイドに従って書いた Excel の VBA コードがあります - http://damianblog.com/2009/07/05/excel-wcf/

動作しています。パラメーターと戻り値を持つ単純な関数でテストしました-結果が正しく返されます。ここで必要なのは、参照によっていくつかのパラメーターを渡し、それらの値を関数に設定してから返すことです。そのために、このテスト関数を作成しました:

// interface...
[OperationContract]
int Read(ref int val1, ref int val2);

// implementation...
public void Read(ref int val1, ref int val2)
{
    val1 = 10;
    val2 = 20;
}

次のように VBA モジュールから呼び出します。

val1 = 0
val2 = 0

Call service1.Read(val1, val2)
MsgBox val1
MsgBox val2

最終的に得られる値は、10 と 20 ではなく、20 と 0 です。

複数の「byref」パラメーターを持つことはサポートされていませんか、それともここで何か間違っていますか?

PSもう1つの興味深い点は、val1を整数またはlongとして宣言できないことです。これは、service1.Read()呼び出しが「型の不一致」という例外で返されるためです。Variant 型でのみ動作するようです。


編集:わかりました、関数からオブジェクトの配列を返すことで問題を回避しました。このようなもの:

// interface...
[OperationContract]
object[] Read();

// implementation...
public object[] Read()
{
    return new object[4] { 10, 20, "hello world", DateTime.Now };
}

そしてVBAでは:

Dim val() As Variant

val = service1.Read()
MsgBox val(0)
MsgBox val(1)
MsgBox val(2)
MsgBox val(3)

魔法のように働いた

4

1 に答える 1

0

構造を追加して wcf メソッドから戻すことはできますか? つまり、代わりに

int Read(ref int val1, ref int val2);

次のようなことをします

[DataContract]
struct MyDataStructure {

[DataMember]
int val0;

[DataMember]
int val1;

[DataMember]
int val2;

}

...

MyDataStructure Read();
于 2013-04-25T12:56:22.203 に答える