我以混合模式(C ++ / CLI)编写,我无法解决此问题:
String ^progID = "Matrikon.OPC.Server";
CLSID clsid;
HRESULT result = CLSIDFromProgID(progID, &clsid);
错误C2664:' CLSIDFromProgID' :无法从' System :: String ^'转换参数1到LPCOLESTR'
如何将String^
转换为LPCOLESTR
?
谢谢!
答案 0 :(得分:2)
我做了另一种方式:
// 1.
pin_ptr<const WCHAR> str = PtrToStringChars(progID);
LPCOLESTR coleString = (LPWSTR)str;
我发现如果超出范围Define the Scope of Pinning Pointers和pin_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);