【发布时间】:2010-11-06 23:18:34
【问题描述】:
我想将System::String ^ 转换为LPCWSTR。
为
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
请帮忙。
【问题讨论】:
-
m 使用 vc++ .. 只是丢失了代码轨道,所以.. 需要时间来使用答案。
标签: .net winapi visual-c++ clr
我想将System::String ^ 转换为LPCWSTR。
为
FindFirstFile(LPCWSTR,WIN32_FIND_DATA);
请帮忙。
【问题讨论】:
标签: .net winapi visual-c++ clr
您需要使用 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)。这篇文章展示了几个例子:
【讨论】:
要在 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);
【讨论】:
在 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);
}
【讨论】:
wname指向的是s中的实际字符数据,而不是其副本,这可以使其比其他封送解决方案更高效。 (const 暗示)
我发现了
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);
一直像魅力一样工作,似乎是最不冗长的方法。
【讨论】: