C ++将Sytem :: String ^转换为LPCOLESTR

时间:2014-05-31 16:04:51

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

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

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

错误C2664:' CLSIDFromProgID' :无法从' System :: String ^'转换参数1到LPCOLESTR'

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

3 个答案:

答案 0 :(得分:2)

我做了另一种方式:

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

我发现如果超出范围Define the Scope of Pinning Pointerspin_ptr (C++/CLI)pin_ptr将被解除 这段代码对我很有用:

// 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)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

第二,使用ATL转换宏将char *转换为LPCOLESTR:

LPCOLESTR converted_string = A2COLE(pNewCharStr);