我想转换System::String ^
到LPCWSTR
。
对于
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
请帮忙。
我想转换System::String ^
到LPCWSTR
。
对于
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
请帮忙。
在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);
}
要转换系统::字符串OT LPCWSTR在C ++ / CLI中,您可以使用元帅: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);
您需要使用的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我才意识到。 在这种情况下,也可以使用隐式的P / Invoke ,这是一种特性,它只有C ++支撑件(反对C#和VB.NET)。 该文章显示了几个例子:
如何在C ++ / CLI转换各种字符串类型之间
我发现,
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);
已经工作就像一个魅力,似乎是最详细的方法。