我想将System::String ^
转换为LPCWSTR
。
代表
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
请帮忙。
答案 0 :(得分:24)
在C ++ / CLI中执行此操作的最简单方法是使用pin_ptr
:
#include <vcclr.h>
void CallFindFirstFile(System::String^ s)
{
WIN32_FIND_DATA data;
pin_ptr<const wchar_t> wname = PtrToStringChars(s);
FindFirstFile(wname, &data);
}
答案 1 :(得分:10)
要在C ++ / CLI中将System :: String转换为LPCWSTR,您可以使用Marshal::StringToHGlobalAnsi函数将托管字符串转换为非托管字符串。
System::String ^str = "Hello World";
IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
HANDLE hFind = FindFirstFile((LPCSTR)ptr.ToPointer(), data);
System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr);
答案 2 :(得分:2)
您需要使用P / Invoke。请检查此链接:http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html
只需添加DllImport
原生函数签名:
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
static extern IntPtr FindFirstFile
(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
和CLR将自动设法进行本机类型封送。
[编辑] 我刚刚意识到你正在使用C ++ / CLI。在这种情况下,您还可以使用implicit P/Invoke,这是一个只有C ++支持的功能(与C#和VB.NET相对)。本文展示了几个例子:
答案 3 :(得分:0)
我找到了
String^ str = "C:\\my.dll";
::LoadLibraryEx(LPCWSTR)Marshal::StringToHGlobalAnsi(str).ToPointer(), 0, flags);
不起作用,返回代码87.相反,
#include <atlstr.h>
CString s("C:\\my.dll");
::LoadLibraryEx((LPCWSTR)s, 0, flags);
一直像魅力一样,似乎是最不详细的方法。