'System :: String ^'到'LPCWSTR'

时间:2009-06-30 10:35:24

标签: .net winapi visual-c++ clr

我想将System::String ^转换为LPCWSTR

代表

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

请帮忙。

4 个答案:

答案 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相对)。本文展示了几个例子:

How to: Convert Between Various String Types in C++/CLI

答案 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);

一直像魅力一样,似乎是最不详细的方法。