【问题标题】:'System::String ^' to 'LPCWSTR''System::String ^' 到 'LPCWSTR'
【发布时间】:2010-11-06 23:18:34
【问题描述】:

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

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

请帮忙。

【问题讨论】:

  • m 使用 vc++ .. 只是丢失了代码轨道,所以.. 需要时间来使用答案。

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


【解决方案1】:

您需要使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在 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 暗示)
      【解决方案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);
      

      一直像魅力一样工作,似乎是最不冗长的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        相关资源
        最近更新 更多