2013-04-25 44 views
0

我開發了一個成功工作的WCF服務。然後,我在Excel中有一些VBA代碼,我按照本指南編寫 - http://damianblog.com/2009/07/05/excel-wcf/從Excel中的VBA代碼調用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 

我到底得的值是20和0,而不是10和20。

是否不支持超過1個'byref'參數或者我在這裏做錯了什麼?

P.S.另一個有趣的事情是我不能將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) 

工作就像一個魅力

回答

0

您可以將您的結構和WCF方法返回回來?我的意思是不是

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

,這樣做

[DataContract] 
struct MyDataStructure { 

[DataMember] 
int val0; 

[DataMember] 
int val1; 

[DataMember] 
int val2; 

} 

... 

MyDataStructure Read(); 
+0

沒有,很遺憾,我不能。我得到一個異常「必需」類型'屬性沒有設置。「當我從VBA調用它時。實際上,如果我在接口的任何地方定義了數據契約,那麼我無法從VBA調用任何WCF的函數。這裏有一個關於這個問題http://stackoverflow.com/questions/8001926/using-a-wcf-service-that-c​​ontains-a-datacontract-inside-excel-vba(他結束了使用2個不同的接口來解決問題) – Vampire 2013-04-25 14:06:49

+0

哦,但是當我去了並重新閱讀我使用的指南時,你剛剛給了我一個想法。它說:「我發現最好保留原始類型和原始類型的數組,數據契約似乎是不可行的。」我可以使用數組!我可以返回一個對象數組。我需要測試一下 – Vampire 2013-04-25 14:20:44