2014-02-28 69 views
0

這裏是場景:如何避免與VSConstants.S_OK字段的命名衝突?

我有WSCF藍色生成的C#Web服務客戶端,我必須從C調用我用C++ CLI「橋」。在C#web服務客戶端我有

namespace MyCompany.Product.ExternalPlan.Client 
{ 
    public enum TMsgStatus 
    { 
     S_OK, 
     //... 
     E_ERROR, 
    } 

這是好的。

的C++ CLI項目做這樣的事情(這不是任何命名空間!!):

try 
{ 
    EPClient::Client^ client = gcnew EPClient::Client(); 
    m_ResponseHeader = client->CreateExternalProject(n_Project->Id, m_ProjectData,  m_NameValuePairs, // in 
            m_PlanAndWorksExternal, ConvertNativeToManaged(n_UserName),   // in 
            m_ProjectRet, m_PlanAndWorksRet);         // out 
} 
catch (Exception^e) 
{ 
    // ... 
    return -1; 
} 

if (m_ResponseHeader->Status == MyCompany::Product::ExternalPlan::Client::TMsgStatus::S_OK) 
{ 
    ConvertManagedToNative(n_ProjectRet, m_ProjectRet); 
} 

現在,如果我改變S_OK的if語句上面E_ERROR沒關係。我讀過C++中的枚舉是全局的,所以我認爲這是它與這個VS事物混合的原因。我對C++編程幾乎一無所知。從C調用C++代碼,我有類似的例子沒有命名空間。我不認爲這很重要,因爲我用全名命名空間來引用S_OK。

謝謝&最好的問候! -matti

+0

在C++ 11中,您可以創建非全局枚舉(Google'enum class',例如,http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum -class.html)。此外,如果您仍然遇到枚舉問題,請嘗試在代碼中使用直接的'integer'值而不是'S_OK'作爲非常快速(可能不是最好的)解決方案。 – Vitaliy

+2

S_OK是出現在Windows SDK #include文件中的*宏*。預處理器將其轉換爲(((HRESULT)0)。這在COM代碼中很重要。如果在C#源文件中重命名是個問題,那麼#undef是一個有效的解決方法。只要你不寫任何COM代碼:) –

回答

2

我認爲這比名稱空間更多的是#define的問題。在使用它的代碼之前嘗試#undef S_OK

+0

謝謝!我嘗試了! –