.net ';系统::字符串^';至';LPCWSTR';

.net ';系统::字符串^';至';LPCWSTR';,.net,winapi,visual-c++,clr,.net,Winapi,Visual C++,Clr,我想将System::String^转换为LPCWSTR 为了 请帮助。您需要使用p/Invoke。检查此链接: 只需添加DllImport本机函数签名: [DllImport("kernel32.dll", CharSet=CharSet.Auto)] static extern IntPtr FindFirstFile (string lpFileName, out WIN32_FIND_DATA lpFindFileData); CLR将自动执行托管到本机类型封送处理 [编

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

为了


请帮助。

您需要使用p/Invoke。检查此链接:

只需添加
DllImport
本机函数签名:

 [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
 static extern IntPtr FindFirstFile
     (string lpFileName, out WIN32_FIND_DATA lpFindFileData);
CLR将自动执行托管到本机类型封送处理

[编辑]我刚刚意识到您正在使用C++/CLI。在这种情况下,您也可以使用,这是一个只有C++支持的特性(与C语言和VB.NET相反)。本文展示了几个例子:


要在C++/CLI中将System::String转换为LPCWSTR,可以使用函数将托管字符串转换为非托管字符串

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

在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);
}
#包括
void CallFindFirstFile(系统::字符串^s)
{
WIN32_查找_数据;
pin_ptr wname=PtrToStringChars;
FindFirstFile(wname和数据);
}
我发现

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);
#包括
CString s(“C:\\my.dll”);
::LoadLibraryEx((LPCWSTR)s,0,标志);

工作起来很有魅力,似乎是最不冗长的方法。

m使用vc++。。刚刚丢失了代码轨道,所以。。需要时间使用答案。应该注意的是,
wname
指向
s
中的实际字符数据,而不是其副本,这可以使其比其他封送处理解决方案更高效。(
const
提示)
#include <atlstr.h>

CString s("C:\\my.dll");
::LoadLibraryEx((LPCWSTR)s, 0, flags);