【发布时间】:2014-02-28 10:30:55
【问题描述】:
这是场景:
我有 WSCF Blue 生成的 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);
}
现在,如果我将上面 if 语句中的 S_OK 更改为 E_ERROR,那就没问题了。我读到 C++ 中的枚举是全局的,所以我认为这就是它与这个 VS 的东西混合在一起的原因。我对 C++ 编程几乎一无所知。 C++ 代码是从 C 调用的,我有类似的示例,它没有命名空间。我认为这甚至不重要,因为我指的是带有完整命名空间的 S_OK。
感谢和最好的问候! -马蒂
【问题讨论】:
-
在 C++ 11 中,您可以创建非全局枚举(google
enum class,例如 cprogramming.com/c++11/…)。此外,如果您仍然遇到枚举问题,请尝试在代码中直接使用integer值而不是S_OK作为非常快速(可能不是最佳)的解决方案。 -
S_OK 是一个出现在 Windows SDK #include 文件中的 宏。预处理器将其转换为 ((HRESULT)0)。它在 COM 代码中很重要。如果在 C# 源代码中重命名它是一个问题,那么 #undef 是一个有效的解决方法。只要你不写任何 COM 代码 :)
标签: c++ enums c++-cli native managed