“系统:字符串^”到“LPCWSTR”('System::String ^' to

2019-06-24 12:37发布

我想转换System::String ^LPCWSTR

对于

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

请帮忙。

Answer 1:

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


Answer 2:

要转换系统::字符串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);


Answer 3:

您需要使用的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转换各种字符串类型之间



Answer 4:

我发现,

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

已经工作就像一个魅力,似乎是最详细的方法。



文章来源: 'System::String ^' to 'LPCWSTR'