【问题标题】:C++ Convert Sytem::String^ to LPCOLESTRC++ 将 System::String^ 转换为 LPCOLESTR
【发布时间】:2014-06-01 22:49:37
【问题描述】:

我以混合模式(C++/CLI)编写,我无法解决这个问题:

String ^progID = "Matrikon.OPC.Server";
CLSID clsid;
HRESULT result = CLSIDFromProgID(progID, &clsid);

错误 C2664:“CLSIDFromProgID”:无法将参数 1 从“System::String ^”转换为“LPCOLESTR”

如何将String^ 转换为LPCOLESTR
谢谢!

【问题讨论】:

    标签: string visual-studio-2008 c++-cli converter


    【解决方案1】:

    我另辟蹊径:

    // 1.
    pin_ptr<const WCHAR> str = PtrToStringChars(progID);
    LPCOLESTR coleString = (LPWSTR)str; 
    

    我发现如果超出范围,pin_ptr 将被释放
    Define the Scope of Pinning Pointers
    pin_ptr (C++/CLI)
    这段代码很适合我:

    // 2. this is the same like (1.)
    String ^progID2 = "Matrikon.OPC.Simulation.1";// This is example of dynamic string
    pin_ptr<const WCHAR> PINprogID2 = PtrToStringChars(progID2);
    CLSID clsid2;
    HRESULT result2 = CLSIDFromProgID(PINprogID2, &clsid2); //(LPCOLESTR, &CLSID)
    


    另一个例子:

    // 3.
    pin_ptr<const WCHAR> sclsid3 = PtrToStringChars("{63D5F432-CFE4-11d1-B2C8-0060083BA1FB}");
    CLSID clsid3;
    CLSIDFromString((WCHAR*)sclsid3, &clsid3); //(LPOLESTR, &CLSID)
    

    我没有多少经验,我不确定是否有一些记忆不足,但我认为那些代码是正确的。

    【讨论】:

      【解决方案2】:

      避免每个钉子都使用锤子。 C++/CLI 让您可以轻松地使用本机类型。所以很简单:

      LPCOLESTR progid = L"Matrikon.OPC.Server";
      // etc..
      

      您可以简单地使用 Type::GetTypeFromProgID() 的非零几率(总是说明原因)。

      【讨论】:

      • 没错,但为了简化我的问题,我粘贴了代码的关键部分。 L"Matrikon.OPC.Server" 不会被使用,progID 将是动态的。
      • 所以你的问题与你试图解决的问题不匹配,你选择的答案也不是你解决它的方式。进展顺利。
      • 我的问题完全符合问题。使用 progID 变量是有目的的。 String ^progID = Console::ReadLine(); CLSID clsid; HRESULT result = CLSIDFromProgID(progID, &amp;clsid);这种搭配更好?我选择的答案是正确的,但在家里我没有快递中的 ATL。我会在星期一上班时检查一下。我可以检查char *pNewCharStr 是否正确。我在工作中尝试了 ATL,我知道 A2COLE 应该正确地转换。在那段时间我找到了不同的方法来解决它,因为我找到了OLESTR == WCHAR
      【解决方案3】:

      首先,让我们将 System::String 转换为 char*

      IntPtr p = Marshal::StringToHGlobalAnsi(progID); char *pNewCharStr = static_cast<char*>(p.ToPointer());

      其次,使用 ATL 转换宏将 char * 转换为 LPCOLESTR:

      LPCOLESTR converted_string = A2COLE(pNewCharStr);

      【讨论】:

      • 我做了另一种方式:pin_ptr str = PtrToStringChars(progID); LPCOLESTR coleString = (LPWSTR)str;
      • @MarekK 请将您的答案作为答案发布。
      • 这种技术还会通过从 Unicode 到 ANSI 到 Unicode 的转换来丢失数据。
      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多