2016-09-17 118 views
0

我有C++代碼,有這樣的參數:如何將字符串參數從C++ com傳遞給c#?

STDMETHODIMP TVinaImpl::test(BSTR Param1) 
{ 
    try 
    { 
     Param1=(L"test1"); 
    } 
    catch(Exception &e) 
    { 
    return Error(e.Message.c_str(), IID_IVina); 
    } 
    return S_OK; 
} 

我使用C++ Builder的:
enter image description here
當我打電話在C#這個COM DLL功能它顯示我的錯誤:

IntPtr a = new IntPtr(); 
vina.test(a); 

它爲空並且沒有得到該值。
如何將C#中的變量傳遞給C++ com並傳回?

回答

2

由於Param1被聲明爲[in, out]參數,您需要將其聲明爲一個指向BSTR:STDMETHODIMP TVinaImpl::test(BSTR* Param1)

而且,你不能簡單地分配字符串文本到BSTR。正確的方法是分配內存使用SysAllocString*Param1 = SysAllocString(L"test1");

+0

如果有什麼方法可以避免在C++中使用SysAllocString? –

+1

不幸的是,這是不可能的。 BSTR由COM管理,並且始終需要從其內存分配器中分配。如果不需要自動化兼容性,則可以考慮使用簡單的'wchar_t *'代替。 – Aurora

+0

有什麼辦法在客戶端(例如在C#中)分配內存並通過引用傳遞參數給C++方法? –

0

我建議你聲明參數Param1爲[out, retval]。您沒有將Param1用作任何輸入。

STDMETHODIMP TVinaImpl::test(BSTR* Param1) 
{ 
    try 
    { 
     *Param1= SysAllocString(L"test1"); 
    } 
    catch(Exception &e) 
    { 
    return Error(e.Message.c_str(), IID_IVina); 
    } 
    return S_OK; 
} 

然後,當你從C#調用函數它是正義的,

string s = vina.test(); 

.NET運行時管理從.NET數據的編組,以COM,反之亦然。

+0

你說得對,但是當我想要返回多個參數來發送我的函數並返回它們時,我該怎麼做。每個函數只能得到一個返回值。 –

相關問題