2014-02-28 2 views
0

다음은 시나리오입니다.VSConstants.S_OK 필드와 이름이 충돌하지 않도록하는 방법?

C에서 호출해야하는 WSCF Blue 생성 C# Web Service 클라이언트가 있습니다. C++ CLI "bridge"로 수행해야합니다. C# 웹 서비스 클라이언트에서 나는

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); 
} 

을 지금은 위가 괜찮 E_ERROR 할 경우 문에서 S_OK를 변경하는 경우. C++에서 enum을 전역 적으로 읽었 기 때문에 그것이 VS와 섞여있는 이유라고 생각합니다. C++ 프로그래밍에 대해서는 거의 아무것도 모른다. C++ 코드가 C에서 호출되었으며 비슷한 예제가 네임 스페이스가 없습니다. 전체 네임 스페이스를 가진 S_OK를 참조하기 때문에 문제가되지 않는다고 생각합니다.

감사합니다. & 최고 감사합니다! -matti

+0

C++ 11에서는 비전 역 enum (google'enum class')을 만들 수 있습니다 (예 : http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum). -class.html). 또한 열거 형에서 여전히 문제가 발생하는 경우 코드에서 'S_OK' 대신 직접'정수 '값을 사용하여 매우 빠른 (최선이 아닐 수도 있음) 해결책으로 사용하십시오. – Vitaliy

+2

S_OK는 Windows SDK #include 파일에 나타나는 * 매크로 *입니다. 사전 처리기는이를 ((HRESULT) 0)로 변환합니다. COM 코드에서 중요합니다. C# 소스에서 이름을 바꾸는 것이 문제라면 #undef가 유효한 해결 방법입니다. 만큼 COM 코드를 작성하지 않는만큼 어쨌든 :) –

답변

2

더 많은 문제가 있다고 생각합니다 #define보다 네임 스페이스입니다. 코드를 사용하기 전에 #undef S_OK을 시도하십시오.

+0

감사합니다! 나는 그것을 시험해 본다! –

관련 문제